我的.txt文件的文件夾重命名爲小寫的擴展與批量重命名擴展爲小寫
ren *.TXT *.txt
但那是因爲我知道分機,其中只有一個。是否有一個循環遍歷目錄並將所有擴展更改爲小寫?
我想:
for %%f in (*.*) do (rename "%%f" "%%~xf")
這一工程......在一定程度上,但它也將刪除的文件名部分。 D'哦!
失敗更好。
我的.txt文件的文件夾重命名爲小寫的擴展與批量重命名擴展爲小寫
ren *.TXT *.txt
但那是因爲我知道分機,其中只有一個。是否有一個循環遍歷目錄並將所有擴展更改爲小寫?
我想:
for %%f in (*.*) do (rename "%%f" "%%~xf")
這一工程......在一定程度上,但它也將刪除的文件名部分。 D'哦!
失敗更好。
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
FOR /f "delims=" %%A IN (
'dir /b /a-d "%sourcedir%\*" '
) DO (
FOR /f "delims=" %%a IN (
'dir /b /l "%sourcedir%\%%A" '
) DO (
if "%%~xa" neq "%%~xA" ECHO REN "%sourcedir%\%%A" "%%~nA%%~xa"
)
)
GOTO :EOF
自然地,兩個嵌套for
命令可被壓實到如果需要一個單一的線 - 在這裏示出多行的可讀性。
您需要更改sourcedir
的設置以適合您的情況。
爲了測試目的,所需的REN命令僅僅是ECHO
。 驗證命令是否正確後,將ECHO REN
更改爲REN
以實際重命名文件。
注意%%A
保留原始字符的情況下,但%%a
(一個完全不同可變)獲取因爲/l
交換機上dir
命令的小寫當量。
繼Aacini的迴應,更廣泛的測試(實際上想而重命名文件只是生成的重命名指令應該乍一看工作)透露,這實際上並不工作,可能是因爲OS看到一個文件被重命名爲自己的名字(無視案例)。哼。
所以 - 第一步是重新命名兩次 - 第一次到一個虛擬的名字,然後從虛擬名稱所需的名稱。
理論上很好。問題在於運營商似乎並不一致地報告相同的字符串 - 幾乎取決於它使用了多少次。所以 - 我試着執行一個子程序,傳遞「to」和「from」文件名。嘗試訪問參數的名稱片段時,該子例程似乎遇到同樣的問題。愁雲。
所以我指定的名稱給一個變量,並試圖處理該。重複刪除字符串.
之前的字符串,直到沒有更多的點,並且您有擴展名。
然後從文件名擴展,但不能使用替換與 - 全無方法,因爲文件名可能是whatever.txt.txt
例如。因此,在循環中逐個刪除最後幾個字符,找到+1的擴展名(對於點)。
所以 - 如果發現擴展的小寫版本是相同ext2
當前情況下的版本,無需重新命名。否則,請重命名爲原始大小寫名稱+小寫擴展名。通過虛擬名稱來確保操作系統本身不會太聰明。
而這裏的結果。當然,以通常的人物形象出現意想不到的結果。
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
:choosedummy
SET "dummyname=dummyname.%random%"
IF EXIST "%sourcedir%\%dummyname%" GOTO choosedummy
FOR /f "delims=" %%A IN (
'dir /b /a-d "%sourcedir%\*" '
) DO (
FOR /f "delims=" %%a IN (
'dir /b /l "%sourcedir%\%%A" '
) DO CALL :casechg "%%a" "%%A"
)
GOTO :EOF
:casechg
SET "ext2=%~2"
SET "name2=%~2"
:ext2loop
IF "%ext2%" neq "%ext2:*.=%" SET "ext2=%ext2:*.=%"&GOTO ext2loop
:: if extension cases are identical, or no extension, skip rename
IF "%~x1" equ "" GOTO :EOF
IF "%~x1" equ ".%ext2%" GOTO :EOF
SET "lop=%ext2%"
:loploop
SET "name2=%name2:~0,-1%"
IF DEFINED lop SET "lop=%lop:~1%"&GOTO loploop
REN "%sourcedir%\%~2" "%dummyname%"
REN "%sourcedir%\%dummyname%" "%name2%%~x1"
GOTO :eof
它是可能與純批次但笨拙。
我建議用包裹在CMDLINE /批次爲這個PowerShell腳本:
powershell -nop -c "gci -file|ren -newname {$_.BaseName+($_.Extension.ToLower())}"
只需添加兩行更你原來的代碼:得到擴展。 2.將其轉換爲小寫。
@echo off
setlocal EnableDelayedExpansion
for %%f in (*.*) do (
set "ext=%%~Xf"
for %%c in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set "ext=!ext:%%c=%%c!"
ren "%%f" "%%~Nf!ext!"
)
編輯:新的方法,下面正確管理時,有沒有擴展名的文件的情況。此方法也更高效,因爲它只將一個字符串轉換爲小寫,並對每個擴展執行ren
命令,而不是對每個文件執行。這些是步驟:1.獲取全部不同文件擴展名中的字符串。 2.將此字符串轉換爲小寫。 3.使用此字符串中的每個擴展名執行ren
命令。
@echo off
setlocal EnableDelayedExpansion
set "exts= "
for %%f in (*.*) do if "!exts:%%~Xf=!" equ "!exts!" set "exts=!exts! %%~Xf"
for %%c in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set "exts=!exts:%%c=%%c!"
for %%e in (%exts%) do ren "*%%e" "*%%e"
+1工程很好,但是對沒有**擴展名**的文件失敗,因爲它會爲名稱添加「a = a」。你應該用if語句來解決這個問題。 –
@AndreKampling:查看我的編輯... – Aacini
好的解決方案很棒!在我看來,OP應該接受這一點,但這顯然留給他/她。 –
相關:https://superuser.com/questions/65302/is-there-a-way-to-batch-rename-files-to-lowercase(但它將整個文件名更改爲小寫) –
您可以使用'* %%〜xf'來獲得修復重命名命令的'* .txt'。但是我不知道'%%〜xf'如何給你一個小寫的擴展名。在我的Win7機器上,'%%〜xf'返回與文件大小相同的擴展名。 –