批處理命令學(xué)習(xí)之:set命令詳解 學(xué)習(xí)要點(diǎn): 1.用set 命令設(shè)置自定義變量 2.用set 命令進(jìn)行字符串處理 3.用set 命令進(jìn)行簡(jiǎ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ò)起來(lái),如%var% 注意:以下用法將清除變量variable 的值,使其變成未定義狀態(tài)。 set variable= 上面等號(hào)后面無(wú)任何符號(hào),如果寫成SET variable=””,此時(shí)變量值并不為空,而是等于兩個(gè)引號(hào),即”” 例2, @echo off set var= set var1=”” if defined var (echo var的值為%var%) else echo var沒(méi)有賦值 if defined var1 (echo var1的值為%var1%) else echo var1沒(méi)有賦值 pause set還可以提供一個(gè)交互界面,讓用戶自己輸入變量的值,然后我們?cè)趤?lái)根據(jù)這個(gè)值來(lái)做相應(yīng)操作,現(xiàn)在我就來(lái)說(shuō)說(shuō)set 的這種語(yǔ)法,只需要加一個(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è)沒(méi)有什么難的,呵呵~~ —————————————————————————————————– 2、字符串截取 格式:%a:~[m[,n]]% 方括號(hào)表示可選,%為變量標(biāo)識(shí)符,a為變量名,不可少,冒號(hào)用于分隔變量名和說(shuō)明部分,符號(hào)~可以簡(jiǎn)單理解為“ 偏移”即可,m 為偏移量(缺省為0),n 為截取長(zhǎng)度(缺省為全部) —————————————————————————————————– 例6, @echo off set a=bbs.bathome.cn set var=%a:~1,3% echo %var% pause 執(zhí)行顯示為:bs. 我們來(lái)分析一下set var=%a:~1,3% ,這里%a:~1,3%就是說(shuō)變量 a偏移量為1,要截取它的3位字符長(zhǎng)度。合起來(lái)就是 把變量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位字符。 —————————————————————————————————– 我們來(lái)道綜合題:輸入任意字符串,求字符串的長(zhǎng)度 例11, @echo off set /p str=請(qǐng)輸入任意長(zhǎng)度的字符串: echo你輸入了字符串:”%str%” call :stringlenth “%str%” num echo字符串長(zhǎng)度為:%num% pause :stringLenth ::字符串長(zhǎng)度計(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 =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è)語(yǔ)文數(shù)字,等下截取后記得看下。 echo.&echo命令形式為:%%var:~m,n%%,其中的m為第一個(gè)參數(shù)可負(fù)可正可為零,n為第二個(gè)參數(shù)可負(fù)可正不為零。 echo.&echo為了方便重復(fù)練習(xí)沒(méi)有設(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)行簡(jiǎn)單計(jì)算 格式:set /a expression /a 命令行開關(guān)指定等號(hào)右邊的字符串為被評(píng)估的數(shù)字表達(dá)式。該表達(dá)式評(píng)估器很簡(jiǎn)單并以遞減的優(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 #范圍 無(wú)效數(shù)字。數(shù)字精確度限為32位。 計(jì)算結(jié)果:1234567890*9876543210= 請(qǐng)按任意鍵繼續(xù). . . 注意:上面的計(jì)算過(guò)程顯示,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ì)算過(guò)程: 請(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ù). . . 我們來(lái)看一看下面的這個(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)行加減操作就可以用這種語(yǔ)法, set /a var =1對(duì)應(yīng)原始語(yǔ)法就是set /a var = %var% 1 set /a var*=2對(duì)應(yīng)原始語(yǔ)法就是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)引起來(lái),也可以用轉(zhuǎn)義字符^,看例子set /a var= 1 “&” 1這樣結(jié)果就顯示出來(lái)了。 其他邏輯或取余操作符用法: 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^<^ echo %num% pause 想一下這個(gè)到底是怎么運(yùn)算的?呵呵,這就留給大家思考了! —————————————————————————————————–
Janunapr 編輯于2009-09-14 星期一11:45:57.46 轉(zhuǎn)載請(qǐng)注明:免費(fèi)實(shí)用綠色軟件 >> 批處理命令學(xué)習(xí)之:set命令詳解
|