batch-file - %%F 变量总是引用 FOR 循环中的最后一项而不是当前项

标签 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=%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!
)

关于batch-file - %%F 变量总是引用 FOR 循环中的最后一项而不是当前项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14628819/

相关文章:

python - 使用 Python WMI 在远程系统上运行本地批处理文件

batch-file - WinSCP 主机 key 通配符选项不起作用

windows - 如何解释批处理字符串中的变量?

c - 使用程序集中的 getchar 获取()函数

batch-file - 在批处理文件中使用变量作为标志

windows - 计算日期 -10 天

vba - 如何使用命令提示符列出目录中的文件名但排除第一个 3 个字符

c++ - 如何使用 DJGPP 在 DOS 下的 C++ 程序中启用鼠标?

sql-server - osql vs Invoke-Sqlcmd-重定向后者的输出

python - 自动化DOSbox应用程序