windows批處理 延遲變量

變量延遲 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

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

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

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

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

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 個人學習批處理的初衷來源于實際工作;在某個迭代版本有個BS(安卓手游模擬器)大需求,從而在測試過程中就重復涉及到...
    Luckykailiu閱讀 4,760評論 0 11
  • 題外話:又到了周三晚上,2019年下半年的學習目標一也已經告一段落,就把最近學習總結的批處理發出來了,一則是方便以...
    爐石不傳說閱讀 558評論 0 1
  • 之前項目用到了MySQL、Redis、MongoDB和其他一些獨立的jar包程序,測試的時候需要用腳本配置java...
    程序猿小董閱讀 726評論 0 0
  • 一、基礎語法: 1.批處理文件是一個“.bat”結尾的文本文件,這個文件的每一行都是一條DOS命令。可以使用任何文...
    蔣_Sir閱讀 9,176評論 1 4
  • OverviewPart 1 – 開始Part 2 – 變量Part 3 – 返回值Part 4 – 標準輸入輸出...
    ettingshausen閱讀 26,075評論 0 5