在剛開始寫Batch的迴圈(for)的時候,都會遇到一個問題,就是在迴圈中,想要去改變(set)
某個變數的值,可是卻沒有作用。
Example:
set var=0
for %%a in (1 1 1 1 1) do (
set /a var+=%%a
echo %var%
)
echo %var%
for %%a in (1 1 1 1 1) do (
set /a var+=%%a
echo %var%
)
echo %var%
Output:
0
0
0
0
0
5
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%
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
2
3
4
5
5
注意在取值時,要延遲展開的變數需使用 !var!才會有效果。
與 setlocal EnableDelayedExpansion對應的是 setlocal DisableDelayedExpansion,其作用為取消延遲變數展開。
沒有留言:
張貼留言