我有以下输入路径:C:\Temp\01 - one\02 - two\03 - three\04 - four\05 - five,我希望将其重命名为C:\Temp\01 one\02 two\03 three\04 four\05 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发布于 2020-05-11 06:22:15
这样的递归文件夹重命名可以使用一个子例程来完成,该子程序根据需要递归地调用自己,这意味着,在这种情况下,只要在两个空格之间找到一个带连字符的子文件夹,就调用自己。
@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是当前目录。
这里还有一个解决方案,它处理当前目录中的所有目录,并处理 all 及其子目录。所有子目录都被重命名为目录名中包含空格、连字符和空格的子目录。
@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名称中不包含空格、连字符和空格。
要了解所使用的命令及其工作方式,请打开一个命令提示符窗口,在那里执行以下命令,并非常仔细地读取为每个命令显示的所有帮助页。
call /?dir /?echo /?exit /?for /?goto /?if /?ren /?set /?setlocal /?https://stackoverflow.com/questions/61714479
复制相似问题