如何将递归目录添加到批处理文件
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
”,以免陷入双引号问题(~
修饰符消除了潜在的双引号);
我有以下批处理文件:
@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
”,以免陷入双引号问题(~
修饰符消除了潜在的双引号);