我一直在解决这里解决的问题: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"))
我得到“系统无法找到路径指定的错误”。 我确信我忽略了一些显而易见的事情。
答案 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
将递归包含所有子文件夹。