我有以下批处理文件:
@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答案 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
修饰符会删除潜在的双重问题引号);