批量内部的变量扩展

时间:2014-02-12 09:02:07

标签: batch-file

我是批处理的新手,我不明白何时使用后期变量扩展或正常扩展。下面我有一个测试脚本,我在其中测试了变量扩展。我注意到内部只有延迟扩展工作。但是我想在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内使用正常扩展? 感谢。

2 个答案:

答案 0 :(得分:3)

当到达代码行或代码块(代码括在forif,...中的括号中)时,解析器将删除所有变量读取,并将其替换为值在行/块开始执行之前的变量内部。因此,如果在行/块内更改变量的值,则在同一行/块内不会显示此更改的值,因为对变量内容的所有访问都已替换为其值。

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

forif命令通常更明显,但构造为

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%