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

How to add recursive directory to batch file

我有以下批处理文件:

@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' 行,但它似乎不起作用。

我需要添加类似...

为 /D /r 做

关闭@echo 下?

您正在使用 "dir" 来枚举文件,因此将“/s”添加到 DIR 命令。

我可能会像这样重构您拥有的内容,使其更易于管理。 这也做递归。

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

使用或者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(returns 完整路径);
  • 改进了第二个 for 选项(您从未使用过第一个标记 %%A,那么为什么要提取它呢?);
  • 将第二个 for 的集合 %%F 替换为 %%~nxF 以仅解析文件名(键入 for /? 以获取有关替换修饰符的详细信息,例如 ~n , ~x);
  • ren 命令的源参数“%%F”替换为“%%~F”,以免陷入双引号问题(~ 修饰符消除了潜在的双引号);