首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在一个目录中至少重命名五个子目录?

在一个目录中至少重命名五个子目录?
EN

Stack Overflow用户
提问于 2020-05-10 15:32:11
回答 1查看 49关注 0票数 0

我有以下输入路径: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级别:

代码语言:javascript
运行
复制
@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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-11 06:22:15

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

代码语言:javascript
运行
复制
@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 及其子目录。所有子目录都被重命名为目录名中包含空格、连字符和空格的子目录。

代码语言:javascript
运行
复制
@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 - TestC:\Temp是当前目录,尽管ABCD Training company Ltd名称中不包含空格、连字符和空格。

要了解所使用的命令及其工作方式,请打开一个命令提示符窗口,在那里执行以下命令,并非常仔细地读取为每个命令显示的所有帮助页。

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

另见去哪里:EOF返回哪里?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61714479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档