2014-02-12 362 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%