變量延遲 setlocal EnableDelayedExpansion
一個讓大多數新手頭痛的問題,網上教程雖多,但多半都是看不懂的,里面的專業術語太多。
以 cn-dos 聯盟的willsort的這篇教程為例,(個人認為是解釋的極具權威和專業的)
http://www.cn-dos.net/forum/viewthread.php?tid=20733&fpage=1&highlight=%E5%BB%B6%E8%BF%9F
但可能就是因為專業,所以才看不懂,因為學cmd批處理的并不一定都是學計算機專業的。
這個鬼東西確實不太好理解,在下也是摸爬滾打多時,總結出一點點經驗,現用通俗的方法
解釋出來,希望能給新手些幫助,老鳥們見笑了,若有不對的地方,歡迎指出。
言歸正傳、
在什么時候需要延遲變量,和該如何引用延遲變量,我想這才是大多數新手迫切想要知道的問題。
耐心看完下面的內容,我想對你應該是有幫助的。
要想了解延遲變量,首先你要明白什么是“復合語句”
好像又來了個“專業”名詞,別急,這個超好理解。
所謂“復合語句”就是指一對()里的所有命令。比如for的do后面
如:
for /f "delims=" %%i in (a.txt) do (
set var=%%i
echo %%i
set num=%%i
)
這里do后面的三句命令,在一對()里面,這就叫“復合語句”,當然不止for 還有if 等等。。
如:
if "%var%"=="abc" (
echo ok
set lis=123
)
反正就是凡是()里的所有命令,就叫“復合語句”
另外:這也是復合語句 set abc=123&echo %abc%
沒錯,通過管道命令&連接起來的命令,也是復合語句。
好,了解了復合語句,現在開始講延遲變量,也就說,在復合語句中才要使用延遲變量。
我們先不去理解什么叫“變量的擴展”這玩意叫法太專業,我到現在都不太明白,
我們只要知道在什么時候需要使用延遲變量,如何才能正確提取到我們需要的變量就可以了,
這才是我們的目的。
cmd在處理“復合語句”的時候,如果“復合語句”中用到了變量,
會把變量的值當作復合語句之前變量的值來引用。如果在此之前變量沒有被賦值,就把它當成空值。
呵呵,有點繞口。看個例子
例1:
@echo off
for /l %%i in (1 1 10) do (
set var=%%i
echo %var%
)
pause
運行上面的代碼,顯示什么?顯示10個echo處于關閉狀態。
按照邏輯,var的值應該依次是 1、2、3........10 才對啊!
這就是因為沒有開啟 延遲變量 的緣故,cmd把var的值當作復合語句之前的值來引用,
而再本例中,復合語句之前并沒有給var定義,所以var的值是空的,所以會顯示10個echo處于關閉狀態。
再看例2:
@echo off
set var=abc
for /l %%i in (1 1 10) do (
set var=%%i
echo %var%
)
pause
運行上面的代碼,會顯示什么,大家應該知道了吧?
再看例3:
@echo off
set var=abc
for /l %%i in (1 1 5) do (
set var%%i=%%i
echo %var%
)
echo %var1% %var2% %var3% %var4% %var5%
pause
運行上面的代碼后,復合語句中所賦的值全部顯示出來了,這說明什么呢?
說明,在復合語句中,并不是沒有給變量賦值,只是你若沒有開啟延遲變量,
你就沒法在復合語句中提取到它,要等復合語句運行完畢后,才能提取到。
變量的表示方法:兩種: 1、%var% 2、!var!
第一種表示方法,大家都知道,第二種就是引用 延遲的變量。
在開啟了延遲變量的情況下,如果在復合語句之外,用哪種方法表示都可以。
但是你若要在復合語句中引用復合語句即時得到的變量,就要用第二種方法。看例子
例4:
@echo off
setlocal EnableDelayedExpansion
set var=abc
for /l %%i in (1 1 10) do (
set var=%%i
echo %var%
echo !var!
)
pause
注意:例子中有兩個echo 一個是顯示 %var% 一個是顯示 !var!
結果很明白了,%var% 顯示的結果是復合語句之前變量var的值,
而 !var! 顯示的就是復合語句中即時得到的值。
再看例5
@echo off
setlocal EnableDelayedExpansion
for /l %%i in (1 1 5) do (
set var%%i=%%i
)
echo %var1% %var2% %var3% %var4% %var5%
echo !var1! !var2! !var3! !var4! !var5!
pause
這個例子說明什么,不用再解釋了吧?
說明在開啟了延遲變量的情況下,且在復合語句之外,用兩種方法都可以表示變量。
就說到這吧。以上的解釋,完全是出于個人的理解,也是為方便非專業人士理解,
解釋肯定有錯誤的地方、就象學習英語時,為方便記憶,用漢字的讀音來作解釋一樣。
呵呵,是一種“偏門”各位新手千萬不要把以上所說的當成是“真理”,否則就變成是“誤人”了。