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

Batch file %%F变量始终引用FOR循环中的最后一项,而不是当前项,batch-file,dos,Batch File,Dos,这看起来应该相当简单,但我在DOS中很难获得一个FOR循环来正确报告它正在评估的当前项 我有一个简单的DOS批处理文件,它循环遍历目录中的所有文件并重命名它们。例如,我的目录包含以下文件: File1.txt File2.txt File3.txt 我想从每个文件中删除TXT扩展名。因此,我的批处理命令类似于: @回音 for %%F in ("*.txt") do ( echo %%F set tmpFile=%%F echo %tmpFile% set newFile=%t

这看起来应该相当简单,但我在DOS中很难获得一个FOR循环来正确报告它正在评估的当前项

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

File1.txt
File2.txt
File3.txt
我想从每个文件中删除TXT扩展名。因此,我的批处理命令类似于:

@回音

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设置为变量总是使用集合中的最后一个文件一样


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

这是因为您正在为
for
循环设置和访问一个变量

您需要使用延迟扩展来访问它们,使用
,而不是
%

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