2017/01/06

Windows平台 - BAT批次次指令: SET 的功能介紹

‧SET :顯示、設定或移除 cmd.exe 環境變數。

‧指令詳解:

SET [variable=[string]]      variable  指定環境變數名稱。      string    指定設定給變數的一系列字元。

僅輸入 SET 而不加上任何參數,可以顯示目前的環境變數。

如果您啟動了擴充指令,SET 指令有以下的改變:

如果執列 SET 指令而且只推演變數名稱,沒有等號或數值的話,指令會顯示出全部字首符合 SET 指令中指定變數名稱的全部變數值。
例如:

    SET P

會列出全部以 ‘P’ 為開頭的環境變數。
如果在目前的環境中找不至變數名稱,SET 指令會將 ERRORLEVEL設為 1。
SET 指令不將等號 (=) 視為變數名稱的一部份。

有兩個新參數已經加至 SET 指令中:

    SET /A expression    SET /P variable=[promptString]

/A 指定在等號右方的字字串是一個要被自變數的數位自變數式。
您可以用運算式進列簡單的自變數,而且支援下列的自變數子
(依照自變數優先(順序)順序由高至低佇列):

() – 組成一群
! ~ – – 單元運算子
* / % – 數位自變數元
+ – – 數位自變數元
<< >> – 邏輯位移
& – 位元自變數 and
^ – 位元自變數 exclusive or
| – 位元自變數 or
= *= /= %= += -= – 指定
&= ^= |= <<= >>=
, – 自變數式分隔字元

如果您使用了任何邏輯或餘數自變數子,您必須將自變數式兩邊括上引號。
任何在自變數式中非數位的字字串會被當作環境變數,並且在使用前會先將這些環境變數交換為數位。

如果您所指定的環境變數名稱尚未在目前環境中定義,那麼他的值會被設為 0。
這可以讓您用環境變數值來做自變數,而不必打入全部的 % 符號來找取得他的值。

如果 SET /A 是用指令檔之外的指令列執列,他會顯示自變數式最後的數值。
指定自變數子需要有個環境變數在等號的左方。

不同進位數:
0x 字首在數位前方代表格十六進位數位、0b 字首代表格二進位數位或 0 字首代表格八進位數位,否則數位值都是指十進位數位。
所以 0x12 就和 18、022 等相同。
請注意八進位數位可能容易弄錯: 像 08 和 09 就不是正確的數位,因為 8 和 9 並不是八進位的正確數位。

/P 參數讓您設定指令列的使用者輸入變數值。
在讀入找取輸入指令列之前,顯示指定的 promptString。
promptString 可以是空白。

環境變數找取代功能已經有下列增強:

%PATH:str1=str2%
會將 PATH 環境變數展開,找取代每個發現的 “str1” 與 “str2″的擴充結果。
“str2” 可以是空白字字串,這會從擴充扇出中移除全部 “str1″。
“str1” 可以用星狀圖形開始,這將會從擴充扇出的開頭開始,對應至從全部第一個發現含有str1 的項目。

您也可以為擴充功能指定子字字串。

    %PATH:~10,5%

這將會擴充 PATH 環境變數,然後只使用擴充結果的第 11 個(位移 10)字元後的 5 個字元如果長度未指定,將會預設為上次使用的變數值。
如果數位(位移或長度)是負數,使用的數位將會是環境變數的長度加上位移或指定長度。

    %PATH:~-10%

將抽出 PATH 變數的最後 10 個字元。

    %PATH:~0,-2%

將抽出 PATH 變數的最後 2 個字元。

最後,系統加入了延遲環境變數展開的支援。

在預設狀態下,指令展開會啟用這項目支援,但是您可以在 CMD.EXE 用 /V 指令列參數來啟動/停用這個功能。
請參看 CMD /?

延遲環境變數展開功能可用來避開展開功能限制。
這項目限制是發生在指令列讀入找取程序,不是發生在執列程序。
下面的範例說明了立即展開變數時會發生的問題:

    set VAR=before    if "%VAR%" == "before" (        set VAR=after;        if "%VAR%" == "after" @echo If you see this, it worked    )

這個例子永遠無法顯示 echo 訊息,因為在兩個 IF 敘述中的 %VAR% 會在第一個 IF 敘述被讀入入時便被展開。
這是因為他是邏輯上推演了 IF 的內部,而內部又是一個複合敘述。
所以在複合敘述內的 IF 實際上是用”before” 和 “after” 來比較,而這永遠不會為真。
同樣的,下面的例子也不會作用:

    set LIST=    for %i in (*) do set LIST=%LIST% %i    echo %LIST%

這個例子中並不會建立目前目錄中全部檔案的清單,相反的只會將 LIST 變數設為最後一個找至的檔案。
同樣地,這是因為 %LIST% 只有在 FOR 敘述第一次被讀入入時才展開,此時 LIST 變數是空的。
所以我們實際執列的 FOR迴圈是:

    for %i in (*) do set LIST= %i

這只是重複的將 LIST 設為最後找至的檔案。

延遲環境變數展開讓您可以用一個不同的字元 (驚嘆號) 在執列時展開環境變數。
如果啟動了延遲環境變數展開,上面的例子可以被改寫下列而正常作用:

    set VAR=before    if "%VAR%" == "before" (        set VAR=after        if "!VAR!" == "after" @echo If you see this, it worked    )    set LIST=    for %i in (*) do set LIST=!LIST! %i    echo %LIST%

如果您啟動了指令擴充,有幾個動態環境變數會被展開但是不會出現在 SET所顯示的環境變數清單中。
這些變數的值會每次在這些變數被展開時動態地重新計算如果使用者用這些變數的名稱來定義變數時,
則這個新定義會疊層以下所列的動態變數:

%CD% – 展開為含目前目錄的字字串。
%DATE% – 展開為與 DATE 指令格式相同的目前日期字字串。
%TIME% – 展開為與 TIME 指令格式相同的目前時間字字串。
%RANDOM% – 展開為一個在 0 和 32767 之間的整數亂數值。
%ERRORLEVEL% – 展開為目前的 ERRORLEVEL 值
%CMDEXTVERSION% – 展開為目前的指令處理擴充功能的版本號碼。
%CMDCMDLINE% – 展開為執列指令處理器前的原始指令列。

沒有留言:

張貼留言