標題: [分享] BAT批次次指令: SET 的功能介紹 [打印本頁] 作者: a448488 時間: 2013-8-15 21:27 標題: 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]
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迴圈是:
範例:
--------------------------
@echo off
set var=我是值
echo %var%
pause
--------------------------
請看 set var=我是值 ,這就是BAT直接在批次處理作業中設定變數的方法!
set 是指令 var 是變數名 = 號右邊的"我是值"是變數的值
在批次處理作業中要參考這個變就把 var 變數名用兩個%(百分號)括起來,如%var%
如果改成這樣
--------------------------
@echo off
set a=bbs.verybat.cn
set var=%a:~2,-3%
echo %var%
pause
--------------------------作者: a448488 時間: 2013-8-16 01:18 標題: 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% 精確至毫秒,在批次處理作業需要延時處理時可以用到。