3.3 set命令詳解

2022-09-05 15:58 更新

《批處理入門手冊(cè)》
三.批處理高級(jí)語句篇
-----------------------------------------------------------------------------------------------------
3.3 學(xué)習(xí)set命令詳解

學(xué)習(xí)要點(diǎn):
1.用set 命令設(shè)置自定義變量
2.用set 命令進(jìn)行字符串處理
3.用set 命令進(jìn)行簡單計(jì)算
-----------------------------------------------------------------------------------------------------


一、用set 命令設(shè)置自定義變量
格式:set [variable=[string]]
variable 指定環(huán)境變量名。 string 指定要指派給變量variable的一系列字符串。
-----------------------------------------------------------------------------------------------------

例1,
@echo off
set var=abcd
echo %var%
pause

在例1中,set var=abcd 是批處理設(shè)置變量的方法。Var是變量名,而abcd則是變量名var的值。echo %var% ,在批
處理中我們要引用這個(gè)變量就把var 變量名用兩個(gè)%(百分號(hào))擴(kuò)起來,如%var%

注意:以下用法將清除變量variable 的值,使其變成未定義狀態(tài)。

set variable=
上面等號(hào)后面無任何符號(hào),如果寫成SET variable="",此時(shí)變量值并不為空,而是等于兩個(gè)引號(hào),即"" 

例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還可以提供一個(gè)交互界面,讓用戶自己輸入變量的值,然后我們?cè)趤砀鶕?jù)這個(gè)值來做相應(yīng)操作,現(xiàn)在我就來說說set
的這種語法,只需要加一個(gè)"/P"參數(shù)就可以了!

例3,
@echo off
set /p var=請(qǐng)輸入變量的值:
echo  您輸入了%var%
pause

執(zhí)行上面的批處理時(shí),系統(tǒng)會(huì)提示你:“請(qǐng)輸入變量的值:”還是自己動(dòng)手嘗試一下吧,呵呵!
-----------------------------------------------------------------------------------------------------

 


二、用set 命令進(jìn)行字符串處理

1、字符串替換
格式:%PATH:str1=str2%
意思就是:將字符串變量%PATH%中的str1 替換為str2
-----------------------------------------------------------------------------------------------------

例4,
@echo off
set a= bbs. bathome. cn
echo  替換前的值: "%a%"
set var=%a: =%
echo  替換后的值: "%var%"
pause

執(zhí)行后顯示:
替換前的值: " bbs. bathome. cn"
替換后的值: "bbs.bathome.cn"

對(duì)比一下,我們發(fā)現(xiàn)它把變量%a%的空格給替換掉了, 而%PATH:str1=str2%這個(gè)操作就是把變量%PATH%的里的str1 全
部用str2 替換。

例5,
@echo off
set a= bbs.bathome.cn
echo  替換前的值: "%a%"
set var=%a:.=小情%
echo  替換后的值: "%var%"
pause

執(zhí)行后顯示:
替換前的值: " bbs.bathome.cn"
替換后的值: " bbs小情bathome小情cn"

這里是把變量%a%里面的"."全部替換為"小情",大家多多動(dòng)手練習(xí)就會(huì)了,這個(gè)沒有什么難的,呵呵~~
-----------------------------------------------------------------------------------------------------


2、字符串截取
格式:%a:~[m[,n]]%
方括號(hào)表示可選,%為變量標(biāo)識(shí)符,a為變量名,不可少,冒號(hào)用于分隔變量名和說明部分,符號(hào)~可以簡單理解為“
偏移”即可,m 為偏移量(缺省為0),n 為截取長度(缺省為全部)
-----------------------------------------------------------------------------------------------------

例6,
@echo off
set a=bbs.bathome.cn
set var=%a:~1,3%
echo %var%
pause

執(zhí)行顯示為:bs.
我們來分析一下set var=%a:~1,3% ,這里%a:~1,3%就是說變量 a  偏移量為1,要截取它的3位字符長度。合起來就是
把變量a 的值從第2 位(偏移量 1)開始,截取3 個(gè)字符賦予變量var

例7,
@echo off
set a=bbs.bathome.cn
set var=%a:~1,-3%
echo %var%
pause

執(zhí)行顯示:bs.bathome
這里就是把變量a 第2位起到倒數(shù)第3位前的值賦予var

例8,
@echo off
set a=bbs.bathome.cn
set var=%a:~-3%
echo %var%
pause

執(zhí)行顯示:.cn
這里就是就是把變量a 倒數(shù) 3 位的值賦予變量var

例9,
@echo off
set a=bbs.bathome.cn
set var=%a:~-3,2%
echo %var%
pause

執(zhí)行顯示:.c

這里就是就是把變量a 倒數(shù) 3 位的值的前2位賦予變量var

例10,
@echo off
set a=bbs.bathome.cn
set var=%a:~3%
echo %var%
pause

執(zhí)行顯示:.bathome.cn
這里就是把變量a 從第3 位開始后面全部的值給變量var

上面這幾個(gè)例子要好好的記住哦,而且不要記錯(cuò)了!


我們還是總結(jié)一下吧:
a=bbs.bathome.cn

%a:~1,3%    -------- “bs.”        變量a 偏離1位,截取3位字符。

%a:~1,-3%   -------- “bs.bathome” 變量a 偏離1位,截取倒數(shù)第3位前的字符。

%a:~-3%    -------- “.cn”        變量a 偏離-3位,截取倒數(shù)的3位字符。

%a:~-3,2%   -------- “.c”        變量a 偏離-3位,截取倒數(shù)后3位的前兩2位字符

%a:~3%     -------- “.bathome.cn”變量a 偏離3位,截取完后面的字符。

%a:~,3%     -------- “bbs”      變量a 偏離0位,截取3位字符。
-----------------------------------------------------------------------------------------------------

我們來道綜合題:輸入任意字符串,求字符串的長度

例11,
@echo off
set /p str=請(qǐng)輸入任意長度的字符串:
echo  你輸入了字符串:"%str%"
call :stringlenth "%str%" num
echo  字符串長度為:%num%
pause
:stringLenth
::字符串長度計(jì)算子程序
set thestring=%~1
::參數(shù)%1 為字符串"%str%",%~1則去掉"%str%"的雙引號(hào)。
if not defined theString goto :eof
set Return=0
:stringLenth_continue
set /a Return =%Return%+1
set thestring=%thestring:~0,-1%
::偏移量為1,截取倒數(shù)第1位前的所有字符。
if defined thestring goto stringLenth_continue
if not "%2"=="" set %2=%Return%
::參數(shù)%2為返回變量num的名稱,不能含空格或特殊字符。
goto :eof
-----------------------------------------------------------------------------------------------------


最后,提供一下batmat寫的一個(gè)例子幫助大家對(duì)截取字符的理解吧:

例子:
@echo off&color a&mode con cols=90 lines=12
title 截取字符練習(xí)工具 by bat-zw19750516
set var=1234567890一二三四五六七八九零
cls&echo.&echo  原始圖案為:%var%
echo.&echo  注意前面有10個(gè)阿拉伯?dāng)?shù)字后面有10個(gè)語文數(shù)字,等下截取后記得看下。
echo.&echo  命令形式為:%%var:~m,n%%,其中的m為第一個(gè)參數(shù)可負(fù)可正可為零,n為第二個(gè)參數(shù)可負(fù)可正不為零。
echo.&echo  為了方便重復(fù)練習(xí)沒有設(shè)置退出,要退出請(qǐng)直接關(guān)閉窗口。
echo.&echo  請(qǐng)按任意鍵開始練習(xí)。&pause>nul

:begin
set a=&set b=&set "c="
cls&echo.&set /p a= 請(qǐng)輸入第一個(gè)參數(shù)(應(yīng)為小于20的整數(shù)):
echo %a:-=%|findstr "[^0-9]"&&goto wrong
if "%a%" equ "" goto wrong
if %a% geq 20 goto wrong
cls&echo.&set /p b= 請(qǐng)輸入第二個(gè)參數(shù)(應(yīng)為大于-20并不為零的整數(shù)):
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  請(qǐng)按任意鍵再次練習(xí)。&pause>nul&goto begin

:wrong
cls&echo.&echo  輸入不合要求,請(qǐng)正確輸入。&ping /n 2 127.1 >nul&goto begin
-----------------------------------------------------------------------------------------------------

 


三、用set 命令進(jìn)行簡單計(jì)算
格式:set /a expression
/a 命令行開關(guān)指定等號(hào)右邊的字符串為被評(píng)估的數(shù)字表達(dá)式。該表達(dá)式評(píng)估器很簡單并以遞減的優(yōu)先權(quán)順序支持下
列操作:

  ( )             分組
  !  ~  -        一元運(yùn)算符
  *  /  %       算數(shù)運(yùn)算符
    -           算數(shù)運(yùn)算符
  <<   >>       二進(jìn)制邏輯移位
  &             二進(jìn)制按位“與”
  ^              二進(jìn)制按位“異”
  |              二進(jìn)制按位“或”
  =   *=   /=   %=  =  -=           算數(shù)賦值
  &=   ^=   |=   <<=    >>=          二進(jìn)制運(yùn)算賦值
  ,                                   表達(dá)式分隔符

set 的/a 參數(shù)就是讓set 可以支持?jǐn)?shù)學(xué)符號(hào)進(jìn)行加減等一些數(shù)學(xué)運(yùn)算, 注意:一般的運(yùn)算常為十進(jìn)制運(yùn)算.
-----------------------------------------------------------------------------------------------------

例12,
@echo off
set /p input=請(qǐng)輸入計(jì)算表達(dá)式:
set /a var=%input%
echo  計(jì)算結(jié)果:%input%=%var%
pause

注意:DOS 計(jì)算只能進(jìn)行整數(shù)運(yùn)算,精確到整數(shù),它是不支持浮點(diǎn)計(jì)算的!

請(qǐng)輸入計(jì)算表達(dá)式:1 9 20 30-10
計(jì)算結(jié)果:1 9 20 30-10=50
請(qǐng)按任意鍵繼續(xù). . .

請(qǐng)輸入計(jì)算表達(dá)式:10/3        #除法只能精確到整數(shù)
計(jì)算結(jié)果:10/3=3
請(qǐng)按任意鍵繼續(xù). . .

請(qǐng)輸入計(jì)算表達(dá)式:-100 62       #負(fù)數(shù)
計(jì)算結(jié)果:-100 62=-38
請(qǐng)按任意鍵繼續(xù). . .

請(qǐng)輸入計(jì)算表達(dá)式:100%3         #求余數(shù)
計(jì)算結(jié)果:100%3=1
請(qǐng)按任意鍵繼續(xù). . .

注意:以上的求余數(shù)運(yùn)算符%在批處理程序中必須寫成%%

請(qǐng)輸入計(jì)算表達(dá)式:(25 75)*2/(15 5)     #括號(hào)
計(jì)算結(jié)果:(25 75)*2/(15 5)=10
請(qǐng)按任意鍵繼續(xù). . .

請(qǐng)輸入計(jì)算表達(dá)式:1234567890*9876543210       #范圍
無效數(shù)字。數(shù)字精確度限為  32  位。
計(jì)算結(jié)果:1234567890*9876543210=
請(qǐng)按任意鍵繼續(xù). . .

注意:上面的計(jì)算過程顯示,DOS 計(jì)算只能精確到32 位,這個(gè) 32 位是指二進(jìn)制32 位,其中最高位為符號(hào)位(0 為
正,1 為負(fù)),低位31 位為數(shù)值。31 個(gè) 1 換成十進(jìn)制為2147483647,所以DOS 計(jì)算的有效值范圍是-2147483648
至2147483647,超出該數(shù)值范圍時(shí)計(jì)算出錯(cuò).請(qǐng)看下面的計(jì)算過程:

請(qǐng)輸入計(jì)算表達(dá)式:2147483647-1       #最大值減 1,值有效
計(jì)算結(jié)果:2147483647-1=2147483646
請(qǐng)按任意鍵繼續(xù). . .

請(qǐng)輸入計(jì)算表達(dá)式:2147483647 1        #最大值加 1,出錯(cuò),結(jié)果為最小值
計(jì)算結(jié)果:2147483647 1=-2147483648
請(qǐng)按任意鍵繼續(xù). . .

請(qǐng)輸入計(jì)算表達(dá)式:-2147483648-1      #最小值減 1,出錯(cuò),結(jié)果為最大值
計(jì)算結(jié)果:-2147483648-1=2147483647
請(qǐng)按任意鍵繼續(xù). . .

我們來看一看下面的這個(gè)例子

例13,
@echo off
set /a a=1+1,b=2+1,c=3+1
echo  計(jì)算結(jié)果:%a%,%b%,%c%
pause

執(zhí)行顯示:計(jì)算結(jié)果:2 3 4

發(fā)現(xiàn)其他數(shù)學(xué)運(yùn)算也有效果!,這就是表達(dá)式分隔符"逗"號(hào)的作用!
有時(shí)候我們需要直接在原變量進(jìn)行加減操作就可以用這種語法,
set /a var =1對(duì)應(yīng)原始語法就是set /a var = %var% 1
set /a var*=2對(duì)應(yīng)原始語法就是set /a var = %var%*2

另外還有一些用邏輯或取余操作符,這些符號(hào),按照上面的使用方法會(huì)報(bào)錯(cuò)。比如我們?cè)贑MD 里輸入set /a var=1 & 1
 "與運(yùn)算",它并不會(huì)顯示為 1,而是報(bào)錯(cuò),!
為什么?對(duì)于這樣的"邏輯或取余操作符",我們需要把他們用雙引號(hào)引起來,也可以用轉(zhuǎn)義字符^,看例子set /a var=
1 "&" 1  這樣結(jié)果就顯示出來了。

其他邏輯或取余操作符用法 :
set /a var= 1 " " 1  異運(yùn)算
set /a var= 1 "%" 1 取模運(yùn)算
set /a var= 3 "<<" 2  左移位運(yùn)算,  3 的二進(jìn)制為11,左移2 位為 1100,換成十進(jìn)制就是12,自行驗(yàn)證
set /a var= 4 ">>" 2 右移位運(yùn)算,4 的二進(jìn)制為100,右移動(dòng)2 位為 1,結(jié)果為1

注意:凡是按位計(jì)算均需換算成二進(jìn)制,然后再計(jì)算。

思考題:求2 的n 次方

參考答案:
例14,
@echo off
set /p n=請(qǐng)輸入2 的幾次方:
set /a num=1^<^<n
echo %num%
pause

想一下這個(gè)到底是怎么運(yùn)算的?呵呵,這就留給大家思考了!
-----------------------------------------------------------------------------------------------------

 

Janunapr 編輯于2009-09-14 星期一11:45:57.46

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)