Windows 命令行中的 FOR 循环和变量评估

Windows 命令行中的 FOR 循环和变量评估

将其视为文件的内容.cmd

@echo off
set test1=hello
echo 0 %test1%
for %%F in ( *.txt ) do (
  set test2=%%F
  echo 1 %test1%
  echo 2 %test2%
  echo 3 %%F
)
pause

当我在 Win 7 中从包含 a.txt 和 b.txt 作为唯一 .txt 文件的文件夹运行此脚本时,我得到以下信息:

0 hello
1 hello
2
3 a.txt
1 hello
2
3 b.txt
Press any key to continue . . .

所有“成功”的 echo 命令(以 0、1 和 3 开头)都证明 echo 和变量语法正确。“不成功”的 echo 命令 (2) 只能是 SET 命令不成功的结果。怎么做到的?为什么?我需要什么样的 SET 命令语法才能test2正确分配变量,并且以 2 开头的输出行与以 3 开头的输出行相同?

答案1

SET命令完全正确。实际发生的情况是,命令DO中的所有块FOR在第一次读取时都替换了其变量。此时,test2变量为空,因此这就是输出中回显的内容。

要解决这个问题,你需要使用SETLOCAL 启用延迟扩展在 for 循环之前,将其更改echo %test2%echo !test2!如下:

@echo off
set test1=hello
echo 0 %test1%
setlocal enabledelayedexpansion
for %%F in ( *.txt ) do (
  set test2=%%F
  echo 1 %test1%
  echo 2 !test2!
  echo 3 %%F
)
endlocal
pause

相关内容