2014-02-12 167 views
0

我是批处理新手,我不明白何时使用后期变量扩展或正常扩展。下面我有一个测试脚本,我已经测试了变量扩展。我注意到里面只有延期扩建工程。但是我想在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 

为什么我在只是推迟扩张,我怎么能正常使用扩展里面的呢? 谢谢。

回答

3

当到达一行或一段代码(在forif,...中的圆括号中包含的代码)时,解析器将删除所有变量读取,并将它们替换为变量内的值,块开始执行。因此,如果变量的值在一个行/块内发生更改,则该变化的值在同一行/块内不可见,因为对变量内容的所有访问都被替换为其值。

因此,如果变量的值在一个行/块内发生更改,并且需要在同一行/块内读取/访问该变量的变化值,则需要延迟扩展。

forif命令的地方,这通常是更加明显,但作为构建

set "data=test" 
.... 
set "data=other test" & echo %data% 

显示了同样的问题。当解析器处理最后一行时,%data%被其值替换,然后执行该行。所以执行的最后一行是

set "data=other test" & echo test 
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%