这样的递归文件夹重命名可以使用一个子程序来完成,该子程序会根据需要递归调用自身,这意味着在这种情况下,只要找到两个空格之间带有连字符的子文件夹,就会调用自身。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "eol=| delims=" %%I in ('dir "* - *" /AD /B 2^>nul') do call :RenameFolder "%%~fI"
exit /B
:RenameFolder
for /F "eol=| delims=" %%I in ('dir "%~1\* - *" /AD /B 2^>nul') do call :RenameFolder "%~1\%%I"
set "NewFolderName=%~nx1"
set "NewFolderName=%NewFolderName:-=%"
ren %1 "%NewFolderName%"
goto :EOF
这里的重要技巧是每个 FOR 循环处理内存中捕获的文件夹名称列表,并且不直接从文件系统处理与通配符模式匹配的文件夹名称作为文件夹名称匹配的列表每次重命名文件夹时,通配符模式都会发生变化。在处理文件夹名称列表时,结果将是不确定的,这些文件夹名称在每个文件夹重命名时都会发生变化。
此批处理文件忽略名称中不包含空格、连字符、空格的文件夹及其所有子文件夹,即使在名称中包含空格、连字符、空格的子文件夹上也是如此。出于这个原因,对于文件夹示例 C:\Temp\01 - one\02 - two\03 - three\04 - four\05 - five,它在运行批处理文件时尽可能高效,C:\Temp 是当前目录。
这是另一种解决方案,它处理当前目录中的所有目录及其所有子目录。目录名中包含空格、连字符、空格的所有子目录都被重命名了。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "eol=| delims=" %%I in ('dir /AD /B 2^>nul') do call :ProcessFolder "%%~fI"
exit /B
:ProcessFolder
for /F "eol=| delims=" %%I in ('dir "%~1\" /AD /B 2^>nul') do call :ProcessFolder "%~1\%%I"
set "NewFolderName=%~nx1"
set "NewFolderName=%NewFolderName: - = %"
if not "%~nx1" == "%NewFolderName%" ren %1 "%NewFolderName%"
goto :EOF
这个批处理文件也适用于C:\Temp\ABCD Training company Ltd\500020 - Test\0500020011 - Test,C:\Temp 是当前目录,尽管ABCD Training company Ltd 的名称中不包含空格、连字符和空格。
要了解所使用的命令及其工作原理,请打开command prompt 窗口,在那里执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
call /?
dir /?
echo /?
exit /?
for /?
goto /?
if /?
ren /?
set /?
setlocal /?
另见Where does GOTO :EOF return to?