%% F变量始终引用FOR循环中的最后一项而不是当前项

时间:2013-01-31 15:04:40

标签: batch-file dos

这似乎应该相当简单,但我在DOS中获取FOR循环以正确报告它正在评估的当前项目时遇到了问题。

我有一个简单的DOS批处理文件,它循环遍历目录中的所有文件并重命名它们。比方说我的目录包含以下文件:

File1.txt
File2.txt
File3.txt

我想从每个文件中删除TXT扩展名。所以我的批处理命令看起来像:

@echo off

for %%F in ("*.txt") do (
  echo %%F
  set tmpFile=%%F
  echo %tmpFile%
  set newFile=%tmpFile:~0,-4%.xml
  echo %newFile%
)

我的预期输出是:

File1.txt
File1.txt
File1.xml
File2.txt
File2.txt
File2.xml
File3.txt
File3.txt
File3.xml

而是输出:

File1.txt
File3.txt
File3.xml
File2.txt
File3.txt
File3.xml
File3.txt
File3.txt
File3.xml

就好像将%% F设置为变量总是使用集合中的最后一个文件。

我做错了吗?请注意我知道有更好的方法来简单地更改扩展名。我完成的批处理文件将执行更多操作,但我似乎无法通过这个初始步骤。

1 个答案:

答案 0 :(得分:4)

这是因为您在for循环中设置和访问变量。

您需要使用延迟展开来访问它们,使用!代替%

setlocal enabledelayedexpansion
for %%F in ("*.txt") do (
  echo %%F
  set tmpFile=%%F
  echo !tmpFile!
  set newFile=!tmpFile:~0,-4!.xml
  echo !newFile!
)