2018年6月20日 星期三

[Batch] 延遲變數展開 (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,其作用為取消延遲變數展開。

沒有留言:

張貼留言