将其视为文件的内容.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