如何通过bat文件以递归方式更改大小写的文件名

时间:2016-07-21 10:39:45

标签: windows loops batch-file recursion

我一直在解决这里解决的问题:https://superuser.com/questions/65302/is-there-a-way-to-batch-rename-files-to-lowercase/412413#412413

我希望将文件名从大写更改为小写,因为文件存储在多个文件夹中,我希望以递归方式进行。

我尝试了以下内容:

setlocal EnableDelayedExpansion
CD /D "somefolder"
FOR /D %%G in (*) DO (
FOR /F "Tokens=*" %%f in ('DIR %%G /l/b/a-d') DO (RENAME "%%f"  "%%f")) 

我得到“系统无法找到路径指定的错误”。 我确信我忽略了一些显而易见的事情。

2 个答案:

答案 0 :(得分:2)

您的代码提供路径错误,因为RENAME无法找到该文件。 DIR命令列出子目录中的文件,但您当前的目录不是子目录。

您还有其他问题 - 您没有进行递归文件夹搜索。 / D选项仅列出直接子文件夹。您的代码将错过根“somefolder”中的文件,以及任何两个或更多级别的文件夹。

此外,SuperUser的原始代码存在缺陷。使用"tokens=*"将删除前导空格。文件名可能(但不太可能)以空格开头,然后代码就会中断。要使用的一种正确语法是for /f "eol=: delims=" ...

使用dir /s选项的MichaelS answer无效,因为REN命令不接受目标中的路径信息 - 只能使用文件名和扩展名。通常,您可以使用%%~nxF来解决该问题,但这会恢复到文件名的原始大小写!

这是在命令行上使用的正确递归解决方案:

for /r "somePath" %D in (.) do @for /f "eol=: delims=" %F in ('dir /l/b/a-d "%D"') do @ren "%D\%F" "%F"

从批处理脚本

@echo off
for /r "somePath" %%D in (.) do for /f "eol=: delims=" %%F in ('dir /l/b/a-d "%%D"') do ren "%%D\%%F" "%%F"

如果您愿意超越本机cmd.exe命令,那么另一个选项是我的JREN.BAT regular expression renaming utility,它支持将名称转换为大写或小写的选项。它是纯脚本(混合JScript /批处理),可以在任何Windows机器上从XP开始本地运行 - 不需要第三方exe文件。内置完整文档 - 可通过jren /?从命令行访问,如果需要分页输出,则可访问jren /??

使用JREN,递归解决方案就像:

一样简单
jren "^" "" /s /l

答案 1 :(得分:0)

您不需要遍历子目录。只需将/s添加到dir命令:

FOR /F "Tokens=*" %%f in ('DIR /l/b/a-d/s') DO (RENAME "%%f"  "%%f")

/s将递归包含所有子文件夹。