1. 程式人生 > >Windows 批處理中 setlocal enabledelayedexpansion 的作用

Windows 批處理中 setlocal enabledelayedexpansion 的作用

預處理 環境 oca exp 變量延遲 cell 現在 pac lin

設置本地為延遲擴展。其實也就是:延遲變量,全稱延遲環境變量擴展, 想進階,變量延遲是必過的一關!所以這一部分希望你能認真看。

為了更好的說明問題,我們先引入一個例子。
例1:

?
1 2 3 4 @echo off set a=4 set a=5&echo %a% pause

結果:4
解說:為什麽是4而不是5呢?在echo之前明明已經把變量a的值改成5了?讓我們先了解一下批處理運行命令的機制:批處理讀取命令時是按行讀取的(另外例如for命令等,其後用一對圓括號閉合的所有語句也當作一行),在處理之前要完成必要的預處理工作,這其中就包括對該行命令中的變量賦值。我們現在分析一下例1,批處理在運行到這句“set a=5&echo %a%”之前,先把這一句整句讀取並做了預處理——對變量a賦了值,那麽%a%當然就是4了!(沒有為什麽,批處理就是這樣做的。)而為了能夠感知環境變量的動態變化,批處理設計了變量延遲。簡單來說,在讀取了一條完整的語句之後,不立即對該行的變量賦值,而會在某個單條語句執行之前再進行賦值,也就是說“延遲”了對變量的賦值。那麽如何開啟變量延遲呢?變量延遲又需要註意什麽呢?

舉個例子說明一下:

例2:

?
1 2 3 4 5 @echo off setlocal enabledelayedexpansion set a=4 set a=5&echo !a! pause

結果:5
解說:由於啟動了變量延遲,得到了正確答案。變量延遲的啟動語句是“setlocal enabledelayedexpansion”,並且變量要用一對嘆號“!!”括起來(註意要用英文的嘆號),否則就沒有變量延遲的效果。分析一下例2,首先“setlocal enabledelayedexpansion”開啟變量延遲,然後“set a=4”先給變量a賦值為4,“set a=5&echo !a!”這句是給變量a賦值為5並輸出(由於啟動了變量延遲,所以批處理能夠感知到動態變化,即不是先給該行變量賦值,而是在運行過程中給變量賦值,因此此時a的值就是5了)。

Windows 批處理中 setlocal enabledelayedexpansion 的作用