2018年6月20日 星期三

延遲變數展開 (EnableDelayedExpansion)

在剛開始寫Batch的迴圈(for)的時候,都會遇到一個問題,就是在迴圈中,想要去改變(set)
某個變數的值,可是卻沒有作用。

Example:
set var=0
for %%a in (1 1 1 1 1) do (
   set /a var+=%%a
   echo %var%
)
echo %var%

Output:
0
0
0
0
0
5

上面範例原意是想讓var在每次的迴圈中都+1,最後的值會是5。可是在迴圈中每次echo 出
的值都是一開始的var值0。


原因是 var在 batch file被解析的時候就會提前展開,所以在迴圈中會 echo出一開始被展開的
值。要得到預想的結果就要使用setlocal EnableDelayedExpansion來延遲變數展開,使其在
執行的階段才會被展開。


Example:
setlocal EnableDelayedExpansion
set var=0
for %%a in (1 1 1 1 1) do (
   set /a var+=%%a
   echo !var!
)
echo %var%

Output:
1
2
3
4
5
5

注意在取值時,要延遲展開的變數需使用!var!才會有效果。

與setlocal EnableDelayedExpansion對應的是setlocal DisableDelayedExpansion,其作用為取消延遲變數展開。

沒有留言:

張貼留言