天天看點

DOS批處理進階教程:第五章 set指令詳解(轉)

  • ​​DOS批處理進階教程:第一章 批處理基礎​​
  • ​​DOS批處理進階教程:第二章 DOS循環for指令詳解​​
  • ​​DOS批處理進階教程:第三章 for指令中的變量​​
  • ​​DOS批處理進階教程:第四章 批進行中的變量​​
  • ​​DOS批處理進階教程:第五章 set指令詳解​​
  • ​​DOS批處理進階教程:第六章 if指令講解​​
  • ​​DOS批處理進階教程:第七章 DOS批處理程式設計進階技巧​​

在上一貼中我簡單的介紹了一下SET設定自定義變量的作用,現在我來具體講一下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. set /p var=請輸入變量的值:
  2. echo 您輸入了 %var%  ~_~

set /p 是指令文法  var是變量名    =号右邊的"請輸入變量的值: ",這個是提示語,不是變量的值了!

運作後,我們在提示語後面直接輸入1,就會顯示一行您輸入了 1 ~_~

好了,先回顧到這,現在講SET其他功能

使用set /?檢視SET的幫助我們發現SET除了我上面講的

這兩種文法外,還有如下幾種文法:

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. set /p input=請輸入計算表達式:
  2. set /a var=%input%
  3. echo 計算結果:%input%=%var%

上面的例子是龍卷風設計的,很好用喲,請看下面幾個運算過程:

注意: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. set /p n=請輸入2的幾次方: 
  2. set /a num=1^<^<n
  3. echo %num%

運作結果:

請輸入2的幾次方: 3

8

請輸入2的幾次方: 10

1024

請輸入2的幾次方: 15

32768

三、用set指令進行字元串處理

1、字元串替換

好了,符号說到這,現在說%PATH:str1=str2%

上面文法的意思就是:将字元串變量%PATH%中的str1替換為str2

這個是替換變量值的内容,看例子

  1. set a= bbs. verybat. cn
  2. echo 替換前的值: "%a%"
  3. set var=%a: =%
  4. echo 替換後的值: "%var%"

運作顯示:(龍卷風添加)

替換前的值: " bbs. verybat. cn"

替換後的值: "bbs.verybat.cn"

對比一下,我們發現他把變量%a%的空格給替換掉了,從這個例子,我們就可以發現

%PATH:str1=str2%這個操作就是把變量%PATH%的裡的str1全部用str2替換

比如我們把上面的例子改成這樣

  1. set a=bbs.verybat.cn
  2. set var=%a:.=傷腦筋%

運作顯示: 

替換前的值: "bbs.verybat.cn"

替換後的值: "bbs傷腦筋verybat傷腦筋cn"

解釋set var=%a:.=傷腦筋%

    set是指令 var是變量名 字a是要進行字元替換的變量的值,"."為要替換的值,

"傷腦筋"為替換後的值!

執行後就會把變量%a%裡面的"."全部替換為"傷腦筋"

這就是set的替換字元的很好的功能! 替換功能先講到這,下面将字元串截取功能

請注意:字元串的替換和截取功能在引用變量的地方均可以,并不一定必須要有set指令

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

此例在echo語句中就替換了字元串,效果一樣。

2、字元串截取

**********************************************

截取功能統一文法格式為:%a:~[m[,n]]%

方括号表示可選,%為變量辨別符,a為變量名,不可少,冒号用于分隔變量名和說明部分,符号~可以簡單了解為“偏移”即可,m為偏移量(預設為0),n為截取長度(預設為全部)

%PATH:~10,5%  這個什麼意思,看例子:

截取功能例子1:

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

執行後,我們會發現隻顯示了"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% 看例子

截取功能例子2:

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

運作結果:.cn

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

當然我們也可以改成這樣

截取功能例子3:

  1. set var=%a:~3%

運作顯示:.verybat.cn

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

%PATH:~0,-2%  例子

截取功能例子4:

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

執行後,我們發現顯示的是"bbs.verybat",少了".cn"

從結果分析,很容易分析出,這是把變量a的值從0位開始,

到倒數第三位之間的值全部賦予給var

如果改成這樣

截取功能例子5:

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

運作顯示: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. set /p str=請輸入任意長度的字元串:
  2. echo 你輸入了字元串:"%str%"
  3. call :stringlenth "%str%" num
  4. echo 字元串長度為:%num%
  5. exit
  6. :StringLenth
  7. ::---------字元串長度計算子程式
  8. ::---------參數%1為字元串(如有空格,請用引号括起來)
  9. ::---------參數%2為傳回變量名稱,不能含空格或特殊字元
  10. ::@echo off
  11. set theString=%~1
  12. if not defined theString goto :eof
  13. set Return=0
  14. :StringLenth_continue
  15. set /a Return+=1
  16. set thestring=%thestring:~0,-1%
  17. if defined thestring goto StringLenth_continue
  18. if not "%2"=="" set %2=%Return%
  19. goto :eof