設置本地爲延遲擴展。其實也就是:延遲變量,全稱延遲環境變量擴展, 想進階,變量延遲是必過的一關!因此這一部分但願你能認真看。c++
爲了更好的說明問題,咱們先引入一個例子。
例1:
ide
複製代碼 代碼以下:spa
@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:
cmd
複製代碼 代碼以下:it
@echo off
setlocalenabledelayedexpansion
set a=4
set a=5&echo !a!
pause
io
結果:5
解 說:因爲啓動了變量延遲,獲得了正確答案。變量延遲的啓動語句是「setlocalenabledelayedexpansion」,而且變量要用一對嘆 號「!!」括起來(注意要用英文的歎號),不然就沒有變量延遲的效果。分析一下例2,首先 「setlocalenabledelayedexpansion」開啓變量延遲,而後「set a=4」先給變量a賦值爲4,「set a=5&echo !a!」這句是給變量a賦值爲5並輸出(因爲啓動了變量延遲,因此批處理可以感知到動態變化,即不是先給該行變量賦值,而是在運行過程當中給變量賦值,所以 此時a的值就是5了)。再舉一個例子鞏固一下。
例3:
for循環
複製代碼 代碼以下:編譯
@echo off
setlocalenabledelayedexpansion
for /l %%i in (1,1,5) do ( set a=%%i echo !a! )
pause
class
結果:12345
解 說:本例開啓了變量延遲並用「!!」將變量擴起來,所以獲得咱們預期的結果。若是不用變量延遲會出現什麼結果呢?結果是這樣的:ECHO 處於關閉狀態。ECHO 處於關閉狀態。ECHO 處於關閉狀態。ECHO 處於關閉狀態。ECHO 處於關閉狀態。即沒有感知到for語句中的動態變化。
batman的說明
我來簡要說一下吧:
set:設置
local:本地(環境變量)
enable:可以
delayed:延遲
expansion:擴展
setlocal enabledelayedexpansion就是擴展本地環境變量延遲,
比較下面兩段代碼:
複製代碼 代碼以下:
@echo off
for /l %%i in (1,1,10) do (
set "str=%%i"
echo %str%
)
pause>nul
複製代碼 代碼以下:
@echo off&setlocal enabledelayedexpansion
for /l %%i in (1,1,10) do (
set "str=%%i"
echo !str!
)
pause>nul
第一段代碼只會顯示10行「ECHO 處於關閉狀態。」,而第二段代碼則會正確顯示1-10的10行數字。這是爲何呢?由於在兩段代碼的for循環前str都是沒有被定義的,而因爲第一段代碼沒有開啓變量延遲,因此str值一直是沒有定義,於是顯示出了10行報
錯信息;而第二段代碼開啓了變量延遲,在for循環中每次賦予str的值被傳遞下去,於是會正確顯示10行數字,但這裏的str變量符必需要寫成!str!,這是沒有道理可講的,只要記住就行了。
setlocal enabledelayedexpansion 是什麼意思?
是:設置本地爲延遲擴展。其實也就是:延遲變量,全稱"延遲環境變量擴展",
在cmd執行命令前會對腳本進行預處理,其中有一個過程是變量識別過程,在這個過程當中,若是有兩個%括起來的如%value%相似這樣的變量,就會對其進行識別,而且查找這個變量對應的值,再而將值替換掉這個變量,這個替換值的過程,就叫作變量擴展,而後再執行命令。
在解釋以前,先看幾個例子的區別:
例一:
set value=kkkkkkk
echo %value%
將這段代碼保存到一個後綴爲bat的文本文件中。而後打開dos,進到對應目錄下,執行這個文件,結果以下:
C:\Documents and Settings\Administrator\桌面\ln\temp\bat>set value=kkkkkkk
C:\Documents and Settings\Administrator\桌面\ln\temp\bat>echo kkkkkkk
kkkkkkk
最 後一行是結果,可是在結果以前,還有兩句,set value=kkkkkkk 和 echo kkkkkkk,可是在語句中,咱們並無寫echo kkkkkkk的語句,這代表至少在執行到echo %value% 這句時,對變量進行的值的替換。這就是變量的擴展。
那麼什麼是變量的延遲擴展呢?
如 果你們知道C++的「靜態變量」概念,那就應該知道,c++編譯的時候,會對靜態變量進行值的替換,但這個替換是基於靜態的前提下,那麼進行變量擴展時, 也是這樣,但若是出現動態的狀況會怎樣?在cmd執行中,發生動態的一種狀況是在 for語句中進行變量賦值,例如:
例二:
複製代碼 代碼以下:
@echo off
for /l %%i in (1,1,3) do (
set k=%%i ::對k進行循環賦值
echo %k% %%i
)
執行這樣的腳本,出現以下結果:
_1
_2
_3
結果出現這三句話。_ 表示空格
注:k沒有賦初值,則替換爲空。
例三:
複製代碼 代碼以下:
@echo off
set k=yyy
for /l %%i in (1,1,3) do (
set k= %%i ::對k進行循環賦值
echo %k% %%i
)
結果:
yyy 1
yyy 2
yyy 3
注:k有賦初值,則都替換爲yyy。、
實例四:
複製代碼 代碼以下:
@echo off
setlocal enabledelayedexpansion
set k= 3
for /l %%i in (1,1,3) do (
set k=%%i
echo %k% %%i
)
結果:
3 1
3 2
3 3
這裏已是用了延遲變量,爲何還會出現這種狀況呢?再看實例五:
實例五:
複製代碼 代碼以下:
@echo off
setlocal enabledelayedexpansion
set k= 3
for /l %%i in (1,1,3) do (
set k=%%i
echo !k! %%i
)
結果: 1 1 2 2 3 3 原來在延遲變量擴展中,要使用!來引用變量。