延遲環境變量擴展 setlocal enabledelayedexpansion的作用

延遲變量全稱"延遲環境變量擴展",要理解這個東西,我們還得先理解一下什麼叫擴展!
CMD在解釋我們的命令的時候,首先會讀取命令行一條完整的命令,然後對其進行一些命令格式的匹配操作,看你所輸入的命令格式是不是符合他的要求.
如果我們要在我們的命令中引用一些變量,那麼我們如何讓CMD在解釋我們的命令時,能識別出這個變量呢?這時我們就可以在變量名字兩邊加一個%號,如%name%.當CMD在對讀取我們的整行
命令進行格式匹配的時候,就會發現name這個字符兩邊加了%號,就不會把他當作普通字符處理,
而是會把他當作一個變量處理,變量名叫name!然後CMD就會找到變量名對應的值,用變量名的值替換掉這個變量名字(name),(如果變量名不存在值,就返回空值).再將這個替換好並且匹配的命令執行!這個替換值的過程,就叫做變量擴展,說白了就是把變量的名字,用他的值給替換掉後執行!也就是批處理如何識別一個變量的過程.

(注意:這裏只是變量的擴展的意思,不是延遲環境變量擴展,要理解延遲環境變量擴展,必須先理解什麼是變量的擴展) 也就是批處理如何識別一個變量的過程. ~_~
例如這個一個BAT
set var=test
echo %var%
CMD在讀取到echo %var%這句命令後,就會進行匹配操作,它馬上就發現var字符兩邊有%號,這時他就會把他當作一個變量處理,查看這個var變量名是不是有值,如果有就用他的值把變量名var給替換掉,這裏我們的VAR在上一條命令set var=test中,給var賦值爲test,所以他會用test把%var%這個變量名替換掉,替換後的結果就爲echo test了.這些步驟都是CMD進行匹配操作的步驟,匹配完後,他再執行echo test這條語句,這時我們的CMD中就會echo出一個test了.

什麼是環境變量擴展知道了,那什麼是延遲環境變量擴展呢?
在理解環境變量擴展時,我們知道CMD在解釋命令時,首先會把一條完整的命令進行讀取,然後進行匹配操作,匹配時他會把命令裏的變量用變量的值個替換掉,然後執行這個替換好的命令.
問題就出在"一條完整的命令",在BAT中,IF FOR這樣的命令都可以加括號,將一些命令嵌套在裏面執行.這樣的話對於一條可以加擴號嵌其他命令的命令,他的完整格式就是
for %%i in (....)這樣一個整體.此時,如果我們如果在括號裏面嵌入一些設置變量值的命令,就會出現問題了!
看例子
@echo off
for /l %%i in (1,1,5) do (
        set var=%%i
        echo %var%
)
執行後會顯示5個空行的錯誤提示!爲什麼?根據我們上面說的知識來理解

 
@echo off
set var=test
for /l %%i in (1,1,5) do (
        set var=%%i
        echo %var%
)
這個就會打印5個test了.

通過這兩個例子,大家因該已經理解,如果只有環境變量擴展這個過程的話,如果我們在可以嵌套命令的命令中執行賦值操作時,會讓我們的BAT出現給變量賦值的問題.
那麼這個時候"延遲環境變量擴展",這個概念就被提出來了
在批處理中,我們可以用setloacl ENABLEDELAYEDEXPANSION這個命令來啓用"延遲環境變量擴展"
在我們啓用了"延遲環境變量擴展"後,當CMD在解釋涵有嵌套格式的命令時,他會把嵌套的命令一條一條的先執行一次,然後再進行匹配操作,這樣我們的賦值操作就會完成.並且再"延遲環境變量擴展"啓用後,CMD會用!號來判斷這是不是一個變量,如沒啓用來變量用%name%這樣的格式判斷,啓用後就用!name!這樣的格式判斷了,這個符號我們需要注意!

例子:
@echo off
setlocal ENABLEDELAYEDEXPANSION
set var=test
for /l %%i in (1,1,5) do (
        set var=%%i
        echo !var!
)

這樣大家因該明白什麼是延遲環境變量擴展了吧.
再來一個例子
@echo off
set var=test & echo %test%
pause
這條命令放在一行,表示他是一條完整的命令,不啓用"延遲環境變量擴展",就會出現上面的賦值錯誤!
改成這樣
@echo off
setlocal ENABLEDELAYEDEXPANSION
set var=test & echo !var!
pause
很容易理解了吧!
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章