一, 用set 命令設置自定義變量
格式:set [variable=[string]]
variable 指定環境變量名。 string 指定要指派給變量variable的一系列字符串。
例1,
@echo off
set var=abcd
echo %var%
pause
在例1中,set var=abcd 是批處理設置變量的方法。Var是變量名,而abcd則是變量名var的值。echo %var% ,在批處理中我們要引用這個變量就把var 變量名用兩個%(百分號)擴起來,如%var%
注意:以下用法將清除變量variable 的值,使其變成未定義狀態。
set variable=
上面等號后面無任何符號,如果寫成SET variable="",此時變量值並不為空,而是等於兩個引號,即""
例2,
@echo off
set var=
set var1=""
if defined var (echo var的值為%var%) else echo var沒有賦值
if defined var1 (echo var1的值為%var1%) else echo var1沒有賦值
pause
set還可以提供一個交互界面,讓用戶自己輸入變量的值,然后我們在來根據這個值來做相應操作,現在我就來說說set的這種語法,只需要加一個"/P"參數就可以了!
例3,
@echo off
set /p var=請輸入變量的值:
echo 您輸入了%var%
pause
執行上面的批處理時,系統會提示你:“請輸入變量的值:”還是自己動手嘗試一下吧,呵呵!
二, 用set 命令進行字符串處理
1、字符串替換
格式:%PATH:str1=str2%
意思就是:將字符串變量%PATH%中的str1 替換為str2
例4,
@echo off
set a= bbs. bathome. cn
echo 替換前的值: "%a%"
set var=%a: =%
echo 替換后的值: "%var%"
pause
執行后顯示:
替換前的值: " bbs. bathome. cn"
替換后的值: "bbs.bathome.cn"
對比一下,我們發現它把變量%a%的空格給替換掉了, 而%PATH:str1=str2%這個操作就是把變量%PATH%的里的str1 全部用str2 替換。
例5,
@echo off
set a= bbs.bathome.cn
echo 替換前的值: "%a%"
set var=%a:.=小情%
echo 替換后的值: "%var%"
pause
執行后顯示:
替換前的值: " bbs.bathome.cn"
替換后的值: " bbs小情bathome小情cn"
這里是把變量%a%里面的"."全部替換為"小情",大家多多動手練習就會了,這個沒有什么難的,呵呵~~
2、字符串截取
格式:%a:~[m[,n]]%
方括號表示可選,%為變量標識符,a為變量名,不可少,冒號用於分隔變量名和說明部分,符號~可以簡單理解為“偏移”即可,m 為偏移量(缺省為0),n 為截取長度(缺省為全部)
例6,
@echo off
set a=bbs.bathome.cn
set var=%a:~1,3%
echo %var%
pause
執行顯示為:bs.
我們來分析一下set var=%a:~1,3% ,這里%a:~1,3%就是說變量 a 偏移量為1,要截取它的3位字符長度。合起來就是把變量a 的值從第2 位(偏移量 1)開始,截取3 個字符賦予變量var
例7,
@echo off
set a=bbs.bathome.cn
set var=%a:~1,-3%
echo %var%
pause
執行顯示:bs.bathome
這里就是把變量a 第2位起到倒數第3位前的值賦予var
例8,
@echo off
set a=bbs.bathome.cn
set var=%a:~-3%
echo %var%
pause
執行顯示:.cn
這里就是就是把變量a 倒數 3 位的值賦予變量var
例9,
@echo off
set a=bbs.bathome.cn
set var=%a:~-3,2%
echo %var%
pause
執行顯示:.c
這里就是就是把變量a 倒數 3 位的值的前2位賦予變量var
例10,
@echo off
set a=bbs.bathome.cn
set var=%a:~3%
echo %var%
pause
執行顯示:.bathome.cn
這里就是把變量a 從第3 位開始后面全部的值給變量var
上面這幾個例子要好好的記住哦,而且不要記錯了!
我們還是總結一下吧:
a=bbs.bathome.cn
%a:~1,3% -------- “bs.” 變量a 偏離1位,截取3位字符。
%a:~1,-3% -------- “bs.bathome”變量a 偏離1位,截取倒數第3位前的字符。
%a:~-3% -------- “.cn” 變量a 偏離-3位,截取倒數的3位字符。
%a:~-3,2% -------- “.c” 變量a 偏離-3位,截取倒數后3位的前兩2位字符
%a:~3% -------- “.bathome.cn”變量a 偏離3位,截取完后面的字符。
我們來道綜合題:輸入任意字符串,求字符串的長度
例11,
@echo off
set /p str=請輸入任意長度的字符串:
echo 你輸入了字符串:"%str%"
call :stringlenth "%str%" num
echo 字符串長度為:%num%
pause
:stringLenth
::字符串長度計算子程序
set thestring=%~1
::參數%1 為字符串"%str%",%~1則去掉"%str%"的雙引號。
if not defined theString goto :eof
set Return=0
:stringLenth_continue
set /a Return+=1
set thestring=%thestring:~0,-1%
::偏移量為1,截取倒數第1位前的所有字符。
if defined thestring goto stringLenth_continue
if not "%2"=="" set %2=%Return%
::參數%2為返回變量num的名稱,不能含空格或特殊字符。
goto :eof
最后,提供一下batmat寫的一個例子幫助大家對截取字符的理解吧:
例子:
@echo off&color a&mode con cols=90 lines=12
title 截取字符練習工具 by bat-zw19750516
set var=1234567890一二三四五六七八九零
cls&echo.&echo 原始圖案為:%var%
echo.&echo 注意前面有10個阿拉伯數字后面有10個語文數字,等下截取后記得看下。
echo.&echo 命令形式為:%%var:~m,n%%,其中的m為第一個參數可負可正可為零,n為第二個參數可負可正不為零。
echo.&echo 為了方便重復練習沒有設置退出,要退出請直接關閉窗口。
echo.&echo 請按任意鍵開始練習。&pause>nul
:begin
set a=&set b=&set "c="
cls&echo.&set /p a= 請輸入第一個參數(應為小於20的整數):
echo %a:-=%|findstr "[^0-9]"&&goto wrong
if "%a%" equ "" goto wrong
if %a% geq 20 goto wrong
cls&echo.&set /p b= 請輸入第二個參數(應為大於-20並不為零的整數):
echo %b:-=%|findstr "[^0-9]"&&goto wrong
if "%b%" equ "" goto wrong
if %b% equ 0 goto wrong
if %b% lss -20 goto wrong
set /a c=20-a+b
if %a% lss 0 if %b% lss 0 if %a% geq %b% goto wrong
if %a% gtr 0 if %b% lss 0 if %c% leq 0 goto wrong
cls&echo.&echo 原始圖案為: %var%
echo.&echo 你輸入的截取命令是: %%var:~%a%,%b%%%
echo.&call,echo 截取到的圖案是:%%var:~%a%,%b%%%
echo.&echo 請按任意鍵再次練習。&pause>nul&goto begin
:wrong
cls&echo.&echo 輸入不合要求,請正確輸入。&ping /n 2 127.1 >nul&goto begin
出處:http://blog.sina.com.cn/s/blog_76dbbd7e0100qzid.html
====================================================================
三、用set 命令進行簡單計算
格式:set /a expression
/a 命令行開關指定等號右邊的字符串為被評估的數字表達式。該表達式評估器很簡單並以遞減的優先權順序支持下列操作:
( ) 分組
! ~ - 一元運算符
* / % 算數運算符
+ - 算數運算符
<< >> 二進制邏輯移位
& 二進制按位“與”
^ 二進制按位“異”
| 二進制按位“或”
= *= /= %= += -= 算數賦值
&= ^= |= <<= >>= 二進制運算賦值
, 表達式分隔符
set 的/a 參數就是讓set 可以支持數學符號進行加減等一些數學運算,注意:一般的運算常為十進制運算.還是先來看看例子吧
例12,
@echo off
set /p input=請輸入計算表達式:
set /a var=%input%
echo 計算結果:%input%=%var%
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
請按任意鍵繼續. . .
我們來看一看下面的這個例子
例13,
@echo off
set /a a=1+1,b=2+1,c=3+1
echo 計算結果:%a% %b% %c%
pause
執行顯示:計算結果:2 3 4
發現其他數學運算也有效果!,這就是表達式分隔符"逗"號的作用!
有時候我們需要直接在原變量進行加減操作就可以用這種語法,
set /a var+=1對應原始語法就是set /a var = %var% + 1
set /a var*=2對應原始語法就是set /a var = %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 次方
參考答案:
例14,
@echo off
set /p n=請輸入2 的幾次方:
set /a num=1^<^<n
echo %num%
pause
想一下這個到底是怎么運算的?呵呵,這就留給大家思考了!
好了,關於set 命令的也就講到這里吧,以后有什么要補充的再補上了。
還有一些其他的總結命令,也可以參考我的另外一篇文章:批處理(bat)命令學習的一些總結