【发布时间】:2012-10-04 02:53:06
【问题描述】:
从一个目录开始,我想:
- 递归查看每个子文件夹
- 标识文件列表
- 对这些文件应用更改
- 回到起点,对剩余的目录重新做 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
像魅力一样工作!!!
【问题讨论】:
标签: batch-file directory filepath