我是批处理的新手,我不明白何时使用后期变量扩展或正常扩展。下面我有一个测试脚本,我在其中测试了变量扩展。我注意到内部只有延迟扩展工作。但是我想在for。中使用正常扩展。
@echo off
setlocal
set var=0
echo late var=!var!
echo var=%var%
for /F "delims= " %%A in (temp.txt) do (
echo Analyzing %%A
set line=%%A
echo line=%line%
echo late line=!line!
)
endlocal
输出:
late var=0
var=0
Analyzing bb
line=
late line=bb
Analyzing aa
line=
late line=aa
Analyzing cc
line=
late line=cc
为什么我只进行延迟扩展,如何在for内使用正常扩展? 感谢。
答案 0 :(得分:3)
当到达代码行或代码块(代码括在for
,if
,...中的括号中)时,解析器将删除所有变量读取,并将其替换为值在行/块开始执行之前的变量内部。因此,如果在行/块内更改变量的值,则在同一行/块内不会显示此更改的值,因为对变量内容的所有访问都已替换为其值。
因此,如果在行/块内更改变量的值,并且需要在同一行/块内读取/访问变量的变化值,则需要延迟扩展。
for
和if
命令通常更明显,但构造为
set "data=test"
....
set "data=other test" & echo %data%
显示了同样的问题。当解析器处理最后一行时,%data%
将替换为其值,然后执行该行。所以执行的最后一行是
set "data=other test" & echo test
答案 1 :(得分:2)
这可以起作用,具体取决于被解析的文本,因为毒物字符会影响它。
@echo off
set var=0
echo late var=%var%
echo var=%var%
for /F "delims= " %%A in (temp.txt) do call :next "%%A"
goto :EOF
:next
echo Analyzing %~1
set line=%~1
echo line=%line%
echo late line=%line%