SET命令詳解

一、用set命令設置自訂變數
顯示、設置或刪除 cmd.exe 環境變數。
SET [variable=[string]]
variable 指定環境變數名。
string 指定要指派給變數的一系列字串。
要顯示當前環境變數,鍵入不帶參數的 SET。
SET 命令不允許變數名含有等號。
注意:以下用法將清除變數variable的值,使其變成未定義狀態。
SET variable=
上面等號後面無任何符號,如果寫成SET variable="",此時變數值並不為空,而是等於兩個引號,即""
例子:

1. @echo off

2. set var=我是值

3. echo %var%

4. pause

複製代碼

請看 set var=我是值 ,這就是BAT直接在批次處理中設置變數的方法!
set 是命令 var是變數名 =號右邊的"我是值"是變數的值
在批次處理中我們要引用這個變就把var變數名用兩個%(百分號)擴起來,如%var%
SET還可以提供一個交互介面,讓使用者自己輸入變數的值,然後我們在來根據這個值來做相應操作,現在我就來說說SET的這種語法,只需要加一個"/P"參數就可以了!
SET /P variable=[promptString]
例子:

1. @echo off

2. set /p var=請輸入變數的值:

3. echo 您輸入了 %var% ~_~

4. pause

複製代碼

set /p 是命令語法 var是變數名 =號右邊的"請輸入變數的值: ",這個是提示語,不是變數的值了!
運行後,我們在提示語後面直接輸入1,就會顯示一行您輸入了 1 ~_~
好了,先回顧到這,現在講SET其他功能
使用set /?查看SET的幫助我們發現SET除了我上面講的
SET [variable=[string]]
SET /P variable=[promptString]
這兩種語法外,還有如下幾種語法:
SET /A expression
環境變數替換已如下增強:
%PATH:str1=str2%
%PATH:~10,5%
%PATH:~-10%
%PATH:~0,-2%
這機種語法有什麼用處呢?下面我們來一個個講解他們!
二、用set命令進行簡單計算
語法:SET /A expression
/A 命令列開關指定等號右邊的字串為被評估的數位運算式。該運算式評估器很簡單並以遞減的優先權順序支援下列操作:
() -分組
! ~ - -一元運算子
* / % -算數運算子
+ - -算數運算子
<< >> -二進位邏輯移位元
& -二進位按位元“與”
^ -二進位按位元“異”
| -二進位按位元“或”
= *= /= %= += -= -算數賦值
&= ^= |= <<= >>= -二進位運算賦值
, -運算式分隔符號
如果 SET /A 在命令腳本外的命令列執行的,那麼它顯示該運算式的最後值。除十六進位有 0x 首碼, 八進制有 0 首碼的,數位值為十進位元數字。因此, 0x12 與 18 和 022相同。請注意八進制公式可能很容易搞混: 08 和 09 是無效的數字,因為 8 和 9 不是有效的八進制位數。
上面這些是系統説明裡的內容,看著是不是有點暈,沒關係我來簡單解釋一下:set的/A參數就是讓SET可以支援數學符號進行加減等一些數學運算!
注意:一般的運算常為十進位運算,如果數位字串最左邊為0,將被認為是八進制,從而出錯。比如,0812之類的數位不能參與十進位運算,轉換方法為:10812-10000
例:

1. set aa=0812

2. set /a aa=1%aa%-10000

3. echo %aa%

複製代碼

結果為:812
例:

1. @echo off

2. set /p input=請輸入計算運算式:

3. set /a var=%input%

4. echo 計算結果:%input%=%var%

5. pause

複製代碼

上面的例子是龍捲風設計的,很好用喲,請看下面幾個運算過程:
注意:DOS計算只能進行整數運算,精確到整數
請輸入計算運算式:1+9+20+30-10
計算結果:1+9+20+30-10=50
請按任意鍵繼續. . .
請輸入計算運算式:10/3 #除法只能精確到整數
計算結果:10/3=3
請按任意鍵繼續. . .
請輸入計算運算式:-100+62 #負數
計算結果:-100+62=-38
請按任意鍵繼續. . .
請輸入計算運算式:100%3 #求餘數
計算結果:100%3=1
請按任意鍵繼續. . .
注意:以上的求餘數運算子%在批次程式中必須寫成%%
請輸入計算運算式:(25+75)*2/(15+5) #括弧
計算結果:(25+75)*2/(15+5)=10
請按任意鍵繼續. . .
請輸入計算運算式:1234567890*9876543210 #範圍
無效數字。數字精確度限為 32 位。
計算結果:1234567890*9876543210=
請按任意鍵繼續. . .
注意:上面的計算過程顯示,DOS計算只能精確到32位,這個32位元是指二進位32位元,其中最高位元為符號位元(0為正,1為負),低位31位為數值。31個1換成十進位為2147483647,所以DOS計算的有效值範圍是-2147483648至2147483647,超出該數值範圍時計算出錯,請看下面的計算過程:
請輸入計算運算式:2147483647-1 #最大值減1,值有效
計算結果:2147483647-1=2147483646
請按任意鍵繼續. . .
請輸入計算運算式:2147483647+1 #最大值加1,出錯,結果為最小值
計算結果:2147483647+1=-2147483648
請按任意鍵繼續. . .
請輸入計算運算式:-2147483648-1 #最小值減1,出錯,結果為最大值
計算結果:-2147483648-1=2147483647
請按任意鍵繼續. . .
運行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= 3 "<<" 2 左移位運算, 3的二進位為11,左移2位為1100,換成十進位就是12,自行驗證
set /a var= 4 ">>" 2右移位元運算,4的二進位為100,右移動2位為1,結果為1
龍捲風補充:凡是按位元計算均需換算成二進位。
思考題:求2的n次方
參考答案:

1. @echo off

2. set /p n=請輸入2的幾次方:

3. set /a num=1^<^<n

4. echo %num%

5. pause

複製代碼

運行結果:
請輸入2的幾次方: 3
8
請按任意鍵繼續. . .
請輸入2的幾次方: 10
1024
請按任意鍵繼續. . .
請輸入2的幾次方: 15
32768
請按任意鍵繼續. . .
三、用set命令進行字串處理
1、字串替換
好了,符號說到這,現在說%PATH:str1=str2%
上面語法的意思就是:將字串變數%PATH%中的str1替換為str2
這個是替換變數值的內容,看例子

1. @echo off

2. set a= bbs. verybat. cn

3. echo 替換前的值: "%a%"

4. set var=%a: =%

5. echo 替換後的值: "%var%"

6. pause

複製代碼

運行顯示:(龍捲風添加)
替換前的值: " bbs. verybat. cn"
替換後的值: "bbs.verybat.cn"
對比一下,我們發現他把變數%a%的空格給替換掉了,從這個例子,我們就可以發現
%PATH:str1=str2%這個操作就是把變數%PATH%的裡的str1全部用str2替換
比如我們把上面的例子改成這樣

1. @echo off

2. set a=bbs.verybat.cn

3. echo 替換前的值: "%a%"

4. set var=%a:.=傷腦筋%

5. echo 替換後的值: "%var%"

6. pause

複製代碼

運行顯示:
替換前的值: "bbs.verybat.cn"
替換後的值: "bbs傷腦筋verybat傷腦筋cn"
解釋set var=%a:.=傷腦筋%
set是命令 var是變數名 字a是要進行字元替換的變數的值,"."為要替換的值,
"傷腦筋"為替換後的值!
執行後就會把變數%a%裡面的"."全部替換為"傷腦筋"
這就是set的替換字元的很好的功能! 替換功能先講到這,下面將字串截取功能
請注意:字串的替換和截取功能在引用變數的地方均可以,並不一定必須要有set命令
例:

1. @echo off

2. set a=bbs.verybat.cn

3. echo 替換前的值: "%a%"

4. echo 替換後的值: "%a:.=傷腦筋%"

5. pause

複製代碼

此例在echo語句中就替換了字串,效果一樣。
2、字串截取
**********************************************
截取功能統一語法格式為:%a:~[m[,n]]%
**********************************************
方括號表示可選,%為變數識別字,a為變數名,不可少,冒號用於分隔變數名和說明部分,符號~可以簡單理解為“偏移”即可,m為偏移量(缺省為0),n為截取長度(缺省為全部)
%PATH:~10,5% 這個什麼意思,看例子:
截取功能例子1:

1. @echo off

2. set a=bbs.verybat.cn

3. set var=%a:~1,2%

4. echo %var%

5. pause

複製代碼

執行後,我們會發現只顯示了"bs"兩個字母,我們的變數%a%的值不是為bbs.verybat.cn嗎?
怎麼只顯示了第2個字母和第3個字母"bs",分析一結果我們就可以很容易看出%PATH:~10,5%就是顯示變數PATH裡從11位元(偏移量10)開始的5個字元!
分析set var=%a:~1,2%
set是命令,var是變數值,a要進行字元操作的變數,"1"從變數"a"第幾位元開始顯示,"2"表示顯示幾位元。
合起來就是把變數a的值從第2位(偏移量1)開始,把2個字元賦予給變數var
這樣應該明白了吧~
其他兩種語法
%PATH:~-10%
%PATH:~0,-2%
他們也是顯示指定變數指定幾位元的值的意思
%PATH:~-10% 看例子
截取功能例子2:

1. @echo off

2. set a=bbs.verybat.cn

3. set var=%a:~-3%

4. echo %var%

5. pause

複製代碼

運行結果:.cn
這個就是把變數a倒數3位元的值給變數VAR
當然我們也可以改成這樣
截取功能例子3:

1. @echo off

2. set a=bbs.verybat.cn

3. set var=%a:~3%

4. echo %var%

5. pause

複製代碼

運行顯示:.verybat.cn
這個就是把變數a的從第3位元開始後面全部的值給變數VAR
%PATH:~0,-2% 例子
截取功能例子4:

1. @echo off

2. set a=bbs.verybat.cn

3. set var=%a:~0,-3%

4. echo %var%

5. pause

複製代碼

執行後,我們發現顯示的是"bbs.verybat",少了".cn"
從結果分析,很容易分析出,這是把變數a的值從0位開始,
到倒數第三位元之間的值全部賦予給var
如果改成這樣
截取功能例子5:

1. @echo off

2. set a=bbs.verybat.cn

3. set var=%a:~2,-3%

4. echo %var%

5. pause

複製代碼

運行顯示:s.verybat
那麼他就是顯示從第3位元(偏移量2)開始減去倒數三位元字元的值,並賦予給變數var
講得好,例子就是說明問題,為便於記憶,龍捲風小節如下:
a=bbs.verybat.cn
%a:~1,2% =“bs” 偏移量1,從第二位開始向右取2位
%a:~-3% =“.cn” 偏移量負3,即倒數3位(也可理解為留下右邊3位元),右取全部
%a:~3% =“.verybat.cn” 偏移量3(也可理解為去掉左邊3位元),右取全部
%a:~0,-3% =“bbs.verybat” 偏移量0,右取長度至負3,即倒數3位
%a:~2,-3% =“s.verybat” 偏移量2,右取長度至負3,即倒數3位
**********************************************
所以,截取功能統一語法格式為:%a:~[m[,n]]%
**********************************************
方括號表示可選,%a%為變數名,不可少,冒號用於分隔變數名和說明部分,符號~可以簡單理解為“偏移”即可,m為偏移量(缺省為0),n為截取長度(缺省為全部)
上面所述用法其實相當於vbs函數mid、left、right
%a:~0,n% 相當於函數left(a,n) 取左邊n位
%a:~-m% 相當於函數right(a,m) 取右邊m位
%a:~m,n% 相當於函數mid(a,m+1,n) 從m+1位開始取n位
%a:~m,-n% 相當於函數mid(a,m+1,len(a)-m-n),從m+1位開始,至倒數n+1位
%a:~m % 相當於函數mid(a,m+1,len(a)-m) 或者right(a,len(a)-m),從m+1位元開始取右邊全部。
思考題目:輸入任意字串,求字串的長度
參考答案:

1. @echo off

2. set /p str=請輸入任意長度的字串:

3. echo 你輸入了字串:"%str%"

4. call :stringlenth "%str%" num

5. echo 字串長度為:%num%

6. pause

7. exit

8.

9. :StringLenth

10. ::---------字串長度計算副程式

11. ::---------參數%1為字串(如有空格,請用引號括起來)

12. ::---------參數%2為返回變數名稱,不能含空格或特殊字元

13. ::@echo off

14. set theString=%~1

15. if not defined theString goto :eof

16. set Return=0

17. :StringLenth_continue

18. set /a Return+=1

19. set thestring=%thestring:~0,-1%

20. if defined thestring goto StringLenth_continue

21. if not "%2"=="" set %2=%Return%

22. goto :eof

複製代碼

好了set的一些用法,就介紹到這了

留言

這個網誌中的熱門文章

VMware Workstation 教學之三種網絡設定模式

Elastix 呼入路由設定 (Inbound Routes)