批量重命名扩展名为小写

我可以将.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 /ad "%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 REN更改为REN以实际重命名文件。

请注意, %%A保留了原始字符大小写,但由于dir命令上的/l开关, %%a (一个完全不同的变量)获取了小写字母。


遵循Aacini的回应,更广泛的测试(实际上试图重命名文件,而不是仅仅产生一个应该乍一看工作的重命名指令)显示这实际上并不工作,可能是因为操作系统看到一个文件被重命名为自己的名字(无视情况)。 哼。

所以 – 第一步是重命名两次 – 首先是一个虚拟名称,然后从虚拟名称到所需的名称。

理论上很好。 问题在于~x操作符似乎并不一致地报告相同的字符串 – 几乎取决于它使用了多少次。 所以 – 我试着执行一个子程序,传递“to”和“from”文件名。 当尝试访问参数的名称片段时,子例程似乎也有相同的问题。 愁云。

所以我把这个名字分配给一个变量,然后尝试处理 。 重复删除字符串之前. 在名字中,直到没有更多的点,你有扩展名。

然后从文件名中删除扩展名,但不能使用replace-with-nothing方法,因为文件名可能是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 /ad "%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 / batch中的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 (abcdefghijklmnopqrstu vwxyz) 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 (abcdefghijklmnopqrstu vwxyz) do set "exts=!exts:%%c=%%c!" for %%e in (%exts%) do ren "*%%e" "*%%e"