返回列表 上一主題 發帖

[分享] BAT批次次指令: SET 的功能介紹

[分享] BAT批次次指令: SET 的功能介紹

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% - 展開為執列指令處理器前的原始指令列。

BAT批次指令: SET 的功能範例詳解- 一

本帖最後由 a448488 於 2013-8-15 23:00 編輯

BAT批次指令: SET 的功能範例詳解- 一
-----------------------------------------------------------------------------------------------
•指令:Set

•說明:宣告變數;設定變數。
•備註:在DOS環境下輸入Set,可列出windows環境變數。
•用法:SET gbs=%OS%           找取得作業系統
        SET xdate=%date%       找取得目前日期20130808
        SET xmonth=%date:~5,2% 找取得目前月份08
        SET select=
        SET /P select=請選擇: 等待找取得使用者所輸入字元
•參數:[variable=[string]]
        /P variable=[promptString]
        /A expression
        環境變數取代已下列增強:
        %PATH:str1=str2%
        %PATH:~10,5%
        %PATH:~-10%
        %PATH:~0,-2%


-----------------------------------------------------------------------------------------------

SET [variable=[string]]

範例:
--------------------------
@echo off
set var=我是值
echo %var%
pause
--------------------------
請看 set var=我是值 ,這就是BAT直接在批次處理作業中設定變數的方法!
set 是指令 var 是變數名 = 號右邊的"我是值"是變數的值
在批次處理作業中要參考這個變就把 var 變數名用兩個%(百分號)括起來,如%var%

這種SET語法只能直接在BAT原始碼前賦予變數的值,有時候需要提供一個交互介面,
讓使用者自己輸入變數的值,然後我們在來根據這個值來做相對操作,
--------------------------

SET /P variable=[promptString]

這種SET的語法,只需要加一個"/P"參數就可以了!

範例:
--------------------------
@echo off
set /p var=請輸入變數的值:
if %var% == 1 echo 您輸入了 1 ~_~
pause
--------------------------
set /p 是指令語法 var 是變數名 = 號右邊的"請輸入變數的值: ",這個是提示語,不是變量的值!
執行後,在提示語後面直接輸入1,就會顯示一列輸入的 1 ~_~ ,輸入別的就沒有任何反映!
--------------------------

SET /A expression

/A 指令列開關指定等號右邊的文字串為被評估的數位運算式。
該運算式評估器很簡單並以遞減的優先(順序)支援下列操作:

    ()      - 壓縮形式
    ! ~ -   - 單元運算子
    * / %   - 算數運算子
    + -     - 算數運算子
    << >>   - 邏輯位移
    &       - 按位「與」
    ^       - 按位「互斥或」
    |       - 按位「或」
    = *= /= %= += -= - 賦值
    &= ^= |= <<= >>=
    ,       - 運算式分隔符號

上面這些是系統說明裡的內容,簡單翻譯一下:
set的/A參數就是讓SET可以支援群論符號進列加減等一些群論自變數!

現在舉例子介紹這些群論符號的用法:

看範例:
這裡的例子請直接在CMD下複製指令執行,不需要儲存為BAT!
set /a var=1 + 1
set /a 文法, var變數名 1 + 1 群論式子

複製執行後會直接顯示一個2,或者執行完後我們輸入echo %var%,也是二,
這就是一個簡單的加法自變數!

set /a var=2 - 1         結果是多少呢?如果你看不至結果就echo %var%.....
set /a var=2 * 2         乘法自變數
set /a var=2 / 2         除法自變數
set /a var=(1+1) + (1+1) 結果等於4 看得懂吧!
set /a a=1+1,b=2+1,c=3+1

執行後會顯示一個4,但用echo %a% %b% %c%後看結果,會發現其他群論自變數也有效果!這就是"斗"號的作用!

有時候需要直接在原變數進列加減操作就可以用這種語法

set /a var+=1 這樣的語法對應原始語法就是set /a var = %var% + 1
都是一樣的結果,在原變數的值上在進列群論自變數,不過這樣寫簡單一點
再寫一個:
set /a var*=2
其他都這麼用,只要說明有這個語法!

另外還有一些用邏輯或找取余運算子,這些符號,依照上面的使用方法會報錯的.....

比如在CMD裡輸入set /a var=1 & 1 "與自變數",它並不會顯示為1,而是報錯,為什麼?
對於這樣的"邏輯或找取余運算子",需要把它們用雙引號引起來,看例:

set /a var= 1 "&" 1  這樣結果就顯示出來了,其他邏輯或找取余運算子用法
set /a var= 1 "+" 1  互斥或自變數
set /a var= 1 "%" 1  找取模自變數
set /a var= 2 "<<" 2 次方自變數
set /a var= 4 ">>" 2 ....

這些符號也可以用&= ^= |= <<= >>= 這樣的簡單用法如
set /a var"&=" 1 等於set /a var = %var% "&" 1 注意引號

現在說%PATH:str1=str2%

這個是取代變數值的內容

範例:
--------------------------
@echo off
set a= bbs.verybat.cn
echo 取代前的值: "%a%"
set var=%a: =%
echo 取代後的值: "%var%"
pause
--------------------------
對比一下,發現它把變數%a%的空白字元給取代掉了,從這個範例,我們就可以發現
%PATH:str1=str2%這個操作就是把變數%PATH%的裡的str1全部用str2取代

比如把上面的例子改成這樣
--------------------------
@echo off
set a=bbs.verybat.cn
echo 取代前的值: "%a%"
set var=%a:.=傷腦筋%
echo 取代後的值: "%var%"
pause
--------------------------
翻譯set var=%a:.=傷腦筋%
set指令 var變數名 字a是要進列字元取代的變數的值,"."為要取代的值,"傷腦筋"為取代後的值!
執列後就會把變數%a%裡面的"."全部取代為"傷腦筋"這就是set的隨換字元的很好的功能!


%PATH:~10,5% 這是什麼意思?

範例:
--------------------------
@echo off
set a=bbs.verybat.cn
set var=%a:~1,2%
echo %var%
pause
--------------------------
執列後,會發現只顯示了"bs"兩個字母,變數%a%的值不是為bbs.verybat.cn嗎?
怎麼只顯示了第2個字母和第3個字母"bs",分析一結果就可以很容易看出
%PATH:~10,5%就是顯示變數PATH裡指定幾位的值!
分析set var=%a:~1,2%
set指令 var變數值 a 要進列字元操作的變數 "1" 從變數 "a" 第幾位開始顯示 "2" 顯示幾位和起來就是把變數 a 的值,從第一位開始,把後兩位賦予給變數var
就樣因該明白了吧~
--------------------------
其他兩種語法:
%PATH:~-10%
%PATH:~0,-2%
也是顯示指定變數指定幾位的值得的意思


%PATH:~-10%

範例:
--------------------------
@echo off
set a=bbs.verybat.cn
set var=%a:~-3%
echo %var%
pause
--------------------------

這個就是把變數a倒數3位的值給變數VAR

當然我們也可以改成這樣
--------------------------
@echo off
set a=bbs.verybat.cn
set var=%a:~3%
echo %var%
pause
--------------------------

這個就是把變數a的從第3位開始後面全部的值給變數VAR

%PATH:~0,-2%

範例:
--------------------------
@echo off
set a=bbs.verybat.cn
set var=%a:~0,-3%
echo %var%
pause
--------------------------

執列後,發現顯示的是"bbs.verybat",少了".cn" ;從結果分析,很容易分析出,這是把變數a的值從0位開始,至倒數第三位之間的值全部賦予給var

如果改成這樣
--------------------------
@echo off
set a=bbs.verybat.cn
set var=%a:~2,-3%
echo %var%
pause
--------------------------

TOP

BAT批次指令: SET 的功能範例詳解- 二


SET     顯示,設定環境變數


Syntax:        
        SET [ variable=[string]]
Example:        
        set             顯示目前環境變數
        set P           列出所有以'P'開頭的環境變數
        set USER=Tom    將USER加入環境變數中
        set PATH=C:\test;%PATH%
               將C:\test加入目前的環境變數中(只對當前的Command Prompt有效)
        set /P str=Message
               在螢幕上顯示Message,並將使用者輸入設定為變數str

參考變數可在變數名前後加 % ,即 %變數名%
set                             #顯示目前全部可用的變數,壓縮形式括系統變數和自訂的變數
echo %SystemDrive%    #顯示系統盤盤符。系統變數可以直接參考
set p                          #顯示全部以p開頭的變數,要是一個也沒有就設errorlevel=1
set p=aa1bb1aa2bb2     #設定變數p,並賦值為 = 後面的文字串,即aa1bb1aa2bb2
echo %p%                   #顯示變數p代表格的文字串,即aa1bb1aa2bb2
echo %p:~6%              #顯示變數p中第6個字元以後的全部字元,即aa2bb2
echo %p:~6,3%            #顯示第6個字元以後的3個字元,即aa2
echo %p:~0,3%            #顯示前3個字元,即aa1
echo %p:~-2%             #顯示最後面的2個字元,即b2
echo %p:~0,-2%           #顯示除了最後2個字元以外的其他字元,即aa1bb1aa2b
echo %p:aa=c%            #用c取代變數p中全部的aa,即顯示c1bb1c2bb2
echo %p:aa=%             #將變數p中的全部aa文字串置換為空,即顯示1bb12bb2
echo %p:*bb=c%          #第一個bb及其之前的全部字元被取代為c,即顯示c1aa2bb2
set p=%p:*bb=c%         #設定變數p,賦值為 %p:*bb=c% ,即c1aa2bb2
set /a p=39                  #設定p為數值型變數,值為39
set /a p=39/10              #支援運算子,有小數時用去尾法,39/10=3.9,去尾得3,p=3
set /a p=p/10               #用 /a 參數時,在 = 後面的變數可以不加%直接參考
set /a p=」1&0〞           #」與」自變數,要加引號。其他支援的運算子參見set/?
set p=                         #找取消p變數
set /p p=請輸入
螢幕上顯示」請輸入」,並會將輸入的文字串賦值給變數p
注意這條可以用來找取代 choice 指令
注意變數在 if 和 for 的复合語句裡是單程票全部取代的,
如:
@echo off
set p=aaa
if %p%==aaa (
      echo %p%
      set p=bbb
      echo %p%
      )
結果將顯示
aaa
aaa
因為在讀入找取 if 敘述時已經將全部 %p% 取代為aaa
這裡的""取代"",在 /? 說明裡就是指""擴充""、""環境變數擴充""
可以啟動 [延緩環境變數擴充] 用 ! 來參考變數,即 !變數名!
如:
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set p=aaa
if %p%==aaa (
      echo %p%
      set p=bbb
      echo !p!
      )
ENDLOCAL
結果將顯示
aaa
bbb
還有幾個動態變數,執行 set 看不到
%CD%                       #代表格目前目錄的文字串
%DATE%                    #目前日期
%TIME%                    #目前時間
%RANDOM%                #隨機整數,介於0~32767
%ERRORLEVEL%           #目前 ERRORLEVEL 值
%CMDEXTVERSION%     #目前指令處理器副檔名版本號
%CMDCMDLINE%          #呼叫指令處理器的原始指令列
可以用echo指令檢視每個變數值,如 echo %time%
注意 %time% 精確至毫秒,在批次處理作業需要延時處理時可以用到。

TOP

        靜思自在 : 閒人無樂趣,忙人無是非。
返回列表 上一主題