如何将递归目录添加到批处理文件

时间:2015-07-30 22:02:36

标签: batch-file batch-processing batch-rename

我有以下批处理文件:

@echo off
for /f "delims=" %%F in (
  'dir /b /a-d [*]*'
) do for /f "tokens=1* delims=]" %%A in (
  "%%F"
) do for /f "tokens=*" %%C in ("%%B") do ren "%%F" "%%C"

我希望在根目录中启动它并让它遍历执行操作的所有目录和子目录。

我尝试将/ D和/ r添加到' for'但它似乎没有效果。

我是否需要添加类似......

的内容

for / D / r do

在@echo关闭下?

2 个答案:

答案 0 :(得分:1)

您正在使用“dir”进行文件枚举,因此请在DIR命令中添加“/ s”。

我可能会重构你喜欢的内容,以便更容易管理。 这也是递归。

call :TOP .
goto :EOF

:TOP
    setlocal
    cd "%~f1"
    for /f "delims=" %%F in ('dir /b /a-d [*]*') do call :SubRoutine "%%F"

    for /D %%x in (*) do call :TOP "%%x"  || (echo FAILED2 "%%x" && exit /b 2)
    goto :EOF

:SubRoutine
    for /f "tokens=1* delims=]" %%A in ("%~1") do call :SubRoutine2  "%~1" "%%A" "%%B" 
    goto :EOF

:SubRoutine2
    for /f "tokens=*" %%C in ("%~3") do ren "%~1" "%%C"
    goto :EOF

答案 1 :(得分:1)

使用 <{em> dir for获取所有文件,不要混淆。 使用dir /S进行递归枚举时,请注意仅输出完整路径而不是纯文件名。 这应该这样做:

@echo off
for /f "delims=" %%F in (
  'dir /s /b /a-d [*]*'
) do for /f "tokens=2* delims=]" %%B in (
  "%%~nxF"
) do for /f "tokens=*" %%C in ("%%B") do ren "%%~F" "%%C"

所以我刚才在原始代码中更改了以下内容:

  • /s添加到dir(然后返回完整路径);
  • 改进了第二个for选项(您从未使用过第一个令牌%%A,那么为什么要提取它呢?);
  • 将第%%F项的for替换为%%~nxF以解析文件名(类型for /?,以获取有关替换修饰符的详细信息,例如~n,{ {1}});
  • ~x命令的源参数“%%F”替换为“ren”,不会出现双重引用问题(%%~F修饰符会删除潜在的双重问题引号);