2017-09-04 230 views
1

我的.txt文件的文件夾重命名爲小寫的擴展與批量重命名擴展爲小寫

ren *.TXT *.txt 

但那是因爲我知道分機,其中只有一個。是否有一個循環遍歷目錄並將所有擴展更改爲小寫?

我想:

for %%f in (*.*) do (rename "%%f" "%%~xf") 

這一工程......在一定程度上,但它也將刪除的文件名部分。 D'哦!

失敗更好。

+0

相關:https://superuser.com/questions/65302/is-there-a-way-to-batch-rename-files-to-lowercase(但它將整個文件名更改爲小寫) –

+1

您可以使用'* %%〜xf'來獲得修復重命名命令的'* .txt'。但是我不知道'%%〜xf'如何給你一個小寫的擴展名。在我的Win7機器上,'%%〜xf'返回與文件大小相同的擴展名。 –

回答

3
@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 
+0

此方法在我的Windows 8.1計算機中不起作用。雖然'dir/b/l'命令正確顯示文件名以小寫字母表示,但_original_(upcase)擴展名被替換爲'%%〜xa'部分。我不知道在其他Windows版本中是否也發生了相同的行爲... – Aacini

+0

@Aacini:好吧,它出現了*在W10下創建了正確的ish命令。外表可能具有欺騙性。毫無疑問,操作系統認爲它會繞過任何愚蠢的想法,比如將文件重命名爲當前名稱,所以在'ren'發佈時不會發生變化....並且這是故事開始的地方...... – Magoo

1

可能與純批次但笨拙。

我建議用包裹在CMDLINE /批次爲這個PowerShell腳本:

powershell -nop -c "gci -file|ren -newname {$_.BaseName+($_.Extension.ToLower())}" 
1

只需添加兩行更你原來的代碼:得到擴展。 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" 
+0

+1工程很好,但是對沒有**擴展名**的文件失敗,因爲它會爲名稱添加「a = a」。你應該用if語句來解決這個問題。 –

+0

@AndreKampling:查看我的編輯... – Aacini

+0

好的解決方案很棒!在我看來,OP應該接受這一點,但這顯然留給他/她。 –