从一个目录开始,我想:
- 递归查看每个子文件夹
- 识别文件列表
- 对这些文件应用更改
- 返回起点并在剩余目录上重新执行 1 到 3
这是我通过 DOS 批处理文件进行的尝试:
for /r . %%g in (*.pm) do (
SET FILEPATH=??
SET FILENAME=??
SET CURRENT="%cd%"
cd %FILEPATH%
perl Perl_Script.pl %FILENAME%
cd "%CURRENT"
)
FILEPATH 和 FILENAME 应该设置为什么?
根据 Jakub 的回答,我将程序修改为:
for /r . %%g in (*.pm) do (
SET FILEPATH="%%~pg"
SET FILENAME="%%~g"
SET CURRENT="%cd%"
cd %FILEPATH%
perl Perl_Script.pl %FILENAME%
cd %CURRENT%
)
我可以从日志中确定 FILENAME 和 FILEPATH 正在接收正确的值,但出于某种深不可测的原因,%FILEPATH% 和 %FILENAME% 将始终设置为首先分配给这些变量的值。
谷歌搜索了几个小时后,我意识到有这个延迟扩展的概念。最后(经过一场艰苦的决斗),最终归结为:
setlocal enabledelayedexpansion
for /r . %%g in (*.pm) do (
SET FILEPATH="%%~pg"
SET FILENAME="%%~g"
SET CURRENT="%cd%"
cd !FILEPATH!
perl Perl_Script.pl !FILENAME!
cd %CURRENT%
)
endlocal
奇迹般有效!!!