bat中类似if,for 之类的语句中如果使用变量时,一定要注意变量的展开时机问题,比如:
if [%test%]==[yes] (
flag=%name%
)
常常会发现flag并不等于hello,原因也就是在执行代码之前,变量被扩展。也就是在执行name=“hello”,之前代码已经把%name%用空转换掉。今天我发现网上一个让LOCAL中的变量穿出的用法时,说到用(),这让我想起()应该就是把一串代码当作一个解析执行单元,会先解析后执行。代码如下连接:
:myGetFunc - passing a variable by reference
SETLOCAL
set "aStr=DosTips"
( ENDLOCAL
set "%~1=%aStr%"
)
goto:eof
也许cmd就是把()当作一个单元,先替换后执行,这样ENDLOCAL就不会影响到 %aStr%的值。这个和后面用&写成一行应该类似。