變量延遲 setlocal EnableDelayedExpansion
一個讓大多數新手頭痛的問題,網上教程雖多,但多半都是看不懂的,裡面的專業術語太多。
以 cn-dos 聯盟的willsort的這篇教程為例,(個人認為是解釋的極具權威和專業的)
但可能就是因為專業,是以才看不懂,因為學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:
set var=abc
運作上面的代碼,會顯示什麼,大家應該知道了吧?
再看例3:
for /l %%i in (1 1 5) do (
set var%%i=%%i
echo %var1% %var2% %var3% %var4% %var5%
運作上面的代碼後,複合語句中所賦的值全部顯示出來了,這說明什麼呢?
說明,在複合語句中,并不是沒有給變量指派,隻是你若沒有開啟延遲變量,
你就沒法在複合語句中提取到它,要等複合語句運作完畢後,才能提取到。
變量的表示方法:兩種: 1、%var% 2、!var!
第一種表示方法,大家都知道,第二種就是引用 延遲的變量。
在開啟了延遲變量的情況下,如果在複合語句之外,用哪種方法表示都可以。
但是你若要在複合語句中引用複合語句即時得到的變量,就要用第二種方法。看例子
例4:
setlocal EnableDelayedExpansion
echo !var!
注意:例子中有兩個echo 一個是顯示 %var% 一個是顯示 !var!
結果很明白了,%var% 顯示的結果是複合語句之前變量var的值,
而 !var! 顯示的就是複合語句中即時得到的值。
再看例5
echo !var1! !var2! !var3! !var4! !var5!
這個例子說明什麼,不用再解釋了吧?
說明在開啟了延遲變量的情況下,且在複合語句之外,用兩種方法都可以表示變量。
就說到這吧。以上的解釋,完全是出于個人的了解,也是為友善非專業人士了解,
解釋肯定有錯誤的地方、就象學習英語時,為友善記憶,用漢字的讀音來作解釋一樣。
呵呵,是一種“偏門”各位新手千萬不要把以上所說的當成是“真理”,否則就變成是“誤人”了。
本文轉自leonardos51CTO部落格,原文連結:http://blog.51cto.com/leomars/1857581 ,如需轉載請自行聯系原作者