天天看點

批處理延遲變量

變量延遲   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 ,如需轉載請自行聯系原作者