windows批處理 延遲變量

變量延遲 setlocal EnableDelayedExpansion

一個讓大多數(shù)新手頭痛的問題,網(wǎng)上教程雖多,但多半都是看不懂的,里面的專業(yè)術(shù)語太多。

以 cn-dos 聯(lián)盟的willsort的這篇教程為例,(個人認為是解釋的極具權(quán)威和專業(yè)的)

http://www.cn-dos.net/forum/viewthread.php?tid=20733&fpage=1&highlight=%E5%BB%B6%E8%BF%9F

但可能就是因為專業(yè),所以才看不懂,因為學cmd批處理的并不一定都是學計算機專業(yè)的。

這個鬼東西確實不太好理解,在下也是摸爬滾打多時,總結(jié)出一點點經(jīng)驗,現(xiàn)用通俗的方法

解釋出來,希望能給新手些幫助,老鳥們見笑了,若有不對的地方,歡迎指出。

言歸正傳、

在什么時候需要延遲變量,和該如何引用延遲變量,我想這才是大多數(shù)新手迫切想要知道的問題。

耐心看完下面的內(nèi)容,我想對你應(yīng)該是有幫助的。

要想了解延遲變量,首先你要明白什么是“復(fù)合語句”

好像又來了個“專業(yè)”名詞,別急,這個超好理解。

所謂“復(fù)合語句”就是指一對()里的所有命令。比如for的do后面

如:

for /f "delims=" %%i in (a.txt) do (

   set var=%%i

   echo %%i

   set num=%%i

)

這里do后面的三句命令,在一對()里面,這就叫“復(fù)合語句”,當然不止for 還有if 等等。。

如:

if "%var%"=="abc" (

echo ok

set lis=123

)

反正就是凡是()里的所有命令,就叫“復(fù)合語句”

另外:這也是復(fù)合語句 set abc=123&echo %abc%

沒錯,通過管道命令&連接起來的命令,也是復(fù)合語句。

好,了解了復(fù)合語句,現(xiàn)在開始講延遲變量,也就說,在復(fù)合語句中才要使用延遲變量。

我們先不去理解什么叫“變量的擴展”這玩意叫法太專業(yè),我到現(xiàn)在都不太明白,

我們只要知道在什么時候需要使用延遲變量,如何才能正確提取到我們需要的變量就可以了,

這才是我們的目的。

cmd在處理“復(fù)合語句”的時候,如果“復(fù)合語句”中用到了變量,

會把變量的值當作復(fù)合語句之前變量的值來引用。如果在此之前變量沒有被賦值,就把它當成空值。

呵呵,有點繞口??磦€例子

例1:

@echo off

for /l %%i in (1 1 10) do (

set var=%%i

echo %var%

)

pause

運行上面的代碼,顯示什么?顯示10個echo處于關(guān)閉狀態(tài)。

按照邏輯,var的值應(yīng)該依次是 1、2、3........10 才對?。?/p>

這就是因為沒有開啟 延遲變量 的緣故,cmd把var的值當作復(fù)合語句之前的值來引用,

而再本例中,復(fù)合語句之前并沒有給var定義,所以var的值是空的,所以會顯示10個echo處于關(guān)閉狀態(tài)。

再看例2:

@echo off

set var=abc

for /l %%i in (1 1 10) do (

set var=%%i

echo %var%

)

pause

運行上面的代碼,會顯示什么,大家應(yīng)該知道了吧?

再看例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

運行上面的代碼后,復(fù)合語句中所賦的值全部顯示出來了,這說明什么呢?

說明,在復(fù)合語句中,并不是沒有給變量賦值,只是你若沒有開啟延遲變量,

你就沒法在復(fù)合語句中提取到它,要等復(fù)合語句運行完畢后,才能提取到。

變量的表示方法:兩種: 1、%var% 2、!var!

第一種表示方法,大家都知道,第二種就是引用 延遲的變量。

在開啟了延遲變量的情況下,如果在復(fù)合語句之外,用哪種方法表示都可以。

但是你若要在復(fù)合語句中引用復(fù)合語句即時得到的變量,就要用第二種方法??蠢?/p>

例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!

結(jié)果很明白了,%var% 顯示的結(jié)果是復(fù)合語句之前變量var的值,

而 !var! 顯示的就是復(fù)合語句中即時得到的值。

再看例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

這個例子說明什么,不用再解釋了吧?

說明在開啟了延遲變量的情況下,且在復(fù)合語句之外,用兩種方法都可以表示變量。

就說到這吧。以上的解釋,完全是出于個人的理解,也是為方便非專業(yè)人士理解,

解釋肯定有錯誤的地方、就象學習英語時,為方便記憶,用漢字的讀音來作解釋一樣。

呵呵,是一種“偏門”各位新手千萬不要把以上所說的當成是“真理”,否則就變成是“誤人”了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容