至少重命名一个目录中的五级子目录?

Rename at least five levels of subdirectories within a directory?

我有以下输入路径:C:\Temp - one - two - three - four - five,我希望将其重命名为 C:\Temp one two three four five

以下批量重命名 2 个关卡,但我希望至少重命名 5 个关卡:

@echo off
setlocal enabledelayedexpansion
pushd "C:\Temp"

for /d %%z in (*) do (
  pushd "%%z"
     for /d %%a in (*) do (
         set "folder=%%a"
         ren "%%a" "!folder:-=!"
     )
  popd
)    
for /d %%a in (*) do (
     set "folder=%%a"
     ren "%%a" "!folder:-=!"
)
popd

这样的递归文件夹重命名可以使用一个子程序来完成,该子程序根据需要递归调用自身,这意味着在这种情况下,只要在两个 space 之间找到带有连字符的子文件夹就会调用自身。

@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 循环处理内存中捕获的文件夹名称列表,而不是直接从文件系统处理与通配符模式匹配的文件夹名称作为每次重命名文件夹时,与通配符模式匹配的文件夹名称列表都会发生变化。在处理每个文件夹重命名时更改的文件夹名称列表时,结果将是不确定的。

此批处理文件忽略名称中不包含 space、连字符、space 的文件夹及其所有子文件夹,即使子文件夹中包含 space、连字符、space名义上。因此,对于文件夹示例 C:\Temp - one - two - three - four - five 在 运行 上以 C:\Temp 为当前目录的批处理文件,它的工作效率尽可能高。


这是另一种解决方案,它真正处理当前目录中的所有目录及其 所有 子目录。目录名称中包含 space、连字符、space 的所有子目录都已重命名。

@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 Ltd0020 - Test00020011 - TestC:\Temp 是当前目录,尽管 ABCD Training company Ltd 中不包含 space、连字符、space名字.


要了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • call /?
  • dir /?
  • echo /?
  • exit /?
  • for /?
  • goto /?
  • if /?
  • ren /?
  • set /?
  • setlocal /?

另见