批處理BAT腳本中set命令的使用詳解(批處理之家Batcher)
一、使用 set 命令進(jìn)行賦值
SET [variable=[string]]
1、等號兩邊不要有空格
正確寫法
C:\>set str=ScriptHome
C:\>echo %str%
ScriptHome
錯誤寫法
C:\>set str = ScriptHome
C:\>echo %str%
%str%
2、變量值包含特殊字符需用雙引號
正確寫法
C:\>set "str=Bat&Home"
C:\>echo "%str%"
"Bat&Home"
錯誤寫法
C:\>set str=Bat&Home
'Home' 不是內(nèi)部或外部命令,也
不是可運(yùn)行的程序或批處理文件。
C:\>echo "%str%"
"Bat"
變量值設(shè)置為空可以清空變量值,實現(xiàn)變量初始化。
3、避免使用系統(tǒng)環(huán)境變量同名的自定義變量
例如:
path , date , errorlevel 等
4、語法可行但不推薦使用
使用連等把多個變量賦值成數(shù)字 set /a x=y=100
逗號分隔把多個變量賦值成數(shù)字 set /a x=1,y=2
上面是dos界面下的寫法,下面是批處理中的寫法,主意是變量
示例1:
顯示所有的變量的值
@echo off set pause
示例2:
@echo off set var=我是值 echo %var% pause
請看 set var=我是值 ,這就是BAT直接在批處理中設(shè)置變量的方法!
set 是命令 var是變量名 =號右邊的"我是值"是變量的值
在批處理中我們要引用這個變量就把var變量名用兩個%(百分號)擴(kuò)起來,如%var%
二、使用 set /p 命令讀取輸入
交互獲取用戶輸入
@echo off set /p input=請輸入一個字符串: echo,%input% pause
讀取文件的第一行內(nèi)容
C:\>echo BatHome>1.txt
C:\>set /p input=<"1.txt"
C:\>echo %input%
BatHome
輸出字符串之后不產(chǎn)生換行
@echo off for %%i in (bat home) do ( echo,%%i ) pause
輸出
bat
home
請按任意鍵繼續(xù). . .
@echo off for %%i in (bat home) do ( set /p =%%i<nul ) pause
輸出
bathome請按任意鍵繼續(xù). . .
批處理光標(biāo)回退(非cls清屏)動畫效果演示
@echo off echo bbs.bathome.net set /p =光標(biāo)回退(非cls清屏)動畫效果演示:<nul for /l %%i in (1,1,10) do ( set /p =%%i<nul set /p =<nul ping -n 2 127.1 >nul ) echo, pause
三、使用 set /a 命令進(jìn)行數(shù)學(xué)運(yùn)算(1)
等號右側(cè)的變量可以省略百分號
C:\>set x=1
C:\>set y=2
C:\>set /a n=%x%+%y%3
C:\>set x=1
C:\>set y=2
C:\>set /a n=x+y3
八進(jìn)制和十六進(jìn)制轉(zhuǎn)換成十進(jìn)制很簡單
C:\>set /a 012
10
C:\>set /a 0xA
10
BAT文件里面進(jìn)行“取余”操作的時候需要使用兩個百分號
@echo off set /a n=3%%2 echo %n% pause
邏輯運(yùn)算的特殊字符需要使用雙引號
@echo off set /a "m=1<<10" set /a n=1"<<"10 echo %m% %n% pause
四、使用 set /a 命令進(jìn)行數(shù)學(xué)運(yùn)算(2)
不支持直接計算超大數(shù)(例如磁盤空間的計算)
C:\>set /a n=2147483646+1
2147483647
C:\>set /a n=2147483647+1
-2147483648
C:\>set /a n=2147483648+1無效數(shù)字。數(shù)字精確度限為 32 位。
C:\>set /a n=-2147483646-1 -2147483647
C:\>set /a n=-2147483647-1 -2147483648
C:\>set /a n=-2147483648-1
無效數(shù)字。數(shù)字精確度限為 32 位。
不支持直接計算浮點數(shù)
批處理通過自己編寫算法實現(xiàn)浮點計算
題目:
輸入任意兩個小數(shù)(小數(shù)點后最多為兩位數(shù)),通過批處理輸出兩數(shù)的和、差、積、商
(積、商均保留兩位小數(shù))
@echo off&setlocal enabledelayedexpansion set /p str=輸入的兩數(shù)為: set /a num_1=0,num_2=0,num=1,v=0 for %%a in (%str%) do ( set /a n+=1 for /f "tokens=1,2 delims=." %%b in ("%%a") do ( set "_!n!=%%b" if "%%c" equ "" ( set ".!n!=00"&set /a m+=1 if !m! equ 2 set "flag=a" ) else ( set "a=%%c00"&set "a=!a:~,2!" set ".!n!=!a!" ) ) ) for %%a in (+#h -#c) do ( for /f "tokens=1,2 delims=#" %%b in ("%%a") do ( if "%_1:~,1%" equ "-" set "k1=-" if "%_2:~,1%" equ "-" set "k2=-" set /a %%c1=_1%%b_2,%%c2=!k1!1%.1%%%100%%b!k2!1%.2%%%100 if !%%c1! lss 0 ( if !%%c2! leq -100 set /a %%c2+=100,%%c1-=1 ) else ( if !%%c1! equ 0 ( if !%%c2! lss 0 set "%%c1=-0"&set "a=!%%c2!"&set "%%c2=!a:-=!" ) else ( if !%%c2! lss 0 set /a %%c2+=100,%%c1-=1 ) ) if !%%c2! geq 100 set /a %%c2-=100,%%c1+=1 ) ) for %%a in (h2 c2) do ( set "a=!%%a!"&set "a=!a:-=!"&set %%a=!a! if !a! lss 10 set "%%a=0!a!" ) echo 其和為:%h1%.%h2%&echo 其差為:%c1%.%c2%&set /a n=0 if defined flag set ".1="&set ".2=" for %%a in (1 2) do ( if "!_%%a!" equ "0" ( set "_%%a="&set /a .%%a=1!.%%a!%%100 ) else ( if "!_%%a!" equ "-0" ( set "_%%a=-" ) else ( set "a=!_%%a!"&set "a=!a:-=!" set /a n+=1&call :lp ) ) if "!.%%a!" neq "" set "a=!.%%a!"&call :loop&set ".%%a=!a!" ) set /a num1=3-num_1+num_2,m=4-v if defined flag set /a m=0 if %num1% leq 0 set /a num1=2 for /l %%a in (1,1,%num1%) do set /a num*=10 set /a s=%_1%%.1%*num/%_2%%.2%,j=%_1%%.1%*%_2%%.2% if %j% lss 0 set "j=%j:-=%"&set "jk=-" if %s% lss 0 set "s=%s:-=%"&set "sk=-" if %m% neq 0 if "!j:~%m%!" equ "" set "j=0000%j%"&set "j=!j:~-%m%!" if %s% lss %num% set "s=%num:~1%%s%"&set "s=!s:~-%num1%!" if %m% neq 0 set "j=!j:~,-%m%!.!j:~-%m%,2!" set "s=!s:~,-%num1%!.!s:~-%num1%,2! for %%a in (s j) do ( set "a=!%%a!" if "!a:.=!" equ "!a!" ( set "%%a=!%%a!.00" ) else ( if "!a:~-2,1!" equ "." set "%%a=!%%a!0" ) if "!a:~,1!" equ "." set "%%a=0!%%a!" ) echo 其積為:%jk%%j%&echo 其商為:%sk%%s% pause>nul&goto :eof :lp set /a num_%n%+=1&set "a=%a:~1%" if defined a goto lp goto :eof :loop if "%a:~-1%" equ "0" set "a=%a:~,-1%"&set /a v+=1&goto loop
代碼相當(dāng)復(fù)雜,估計大家肯定會看得云里霧里,所以思來想去還
是補(bǔ)充代碼編寫思路如下,以便理解,同時期待高人出手,給出完美代碼:
一、總體計算思路
大家知道本題最關(guān)鍵是在對小數(shù)點前后兩部分?jǐn)?shù)值的處理上,在樓上大家也有
過相關(guān)討論。本人認(rèn)為在加減法的處理上,應(yīng)該是要將前后數(shù)值分開分別進(jìn)行計
算然后再做處理(如后面小數(shù)位和滿百位的處理),最后再在中間補(bǔ)上小數(shù)點。
而對乘法,則應(yīng)是去掉小數(shù)點后前后位一起運(yùn)算,最后從后向前移位補(bǔ)上小數(shù)點
。至于除法則是最復(fù)雜的,如結(jié)果要保留兩位小數(shù),你必須要保證除數(shù)的數(shù)位比
被除數(shù)多三位(兩數(shù)均先去掉小數(shù)點),當(dāng)這一條件沒有得到滿足時,就要給除
數(shù)后面補(bǔ)上足夠的0,最后在結(jié)果中從后向前移位補(bǔ)上小數(shù)點。
二、對數(shù)值的處理
大家可以看到本人在代碼中使用了海量的if語句來做判斷,主要是為了處理各
種情況下的數(shù)值,大致將情況歸納如下面的12點:
1 處理原始數(shù)值無小數(shù)位的情況--從后面補(bǔ)上.00
2 處理原始數(shù)值小數(shù)位不滿兩位的情況--給小數(shù)位補(bǔ)上00并提取前面的兩位
3 處理加減計算時小數(shù)位大于100的情況--小數(shù)位減去100,整數(shù)位加1
4 處理加減計算整數(shù)位為負(fù)小數(shù)位小于-100的情況--小數(shù)位加上100,整數(shù)位
減1
5 處理加減計算整數(shù)位為0小數(shù)位小于0的情況--整數(shù)位變?yōu)?0,小數(shù)位去掉負(fù)
號
6 處理加減計算整數(shù)位為正小數(shù)位小于0的情況--小數(shù)位加上100,整數(shù)位減1
7 處理加減計算小數(shù)位小于10的情況--在小數(shù)位前面加上0
8 處理乘除計算時兩數(shù)小數(shù)位均為00的情況--將小數(shù)位置空
9 處理乘除計算時整數(shù)位為0的情況--對小數(shù)位進(jìn)行取余運(yùn)算
10 處理乘除計算時結(jié)果數(shù)位不夠小數(shù)位的情況--在結(jié)果值前面補(bǔ)上足夠的0并
從后向前提取小數(shù)位(如結(jié)果為負(fù)數(shù)還要先取掉負(fù)號最后再補(bǔ)上)
11 處理乘除計算時結(jié)果無小數(shù)位的情況--在結(jié)果后補(bǔ)上.00
12 處理乘除計算時結(jié)果小數(shù)位不足兩位的情況--在結(jié)果后補(bǔ)上0
三、感言
在這次編寫代碼的過程中,本人深深感受到批處理在處理數(shù)值上的不足和缺陷
,這也是本人在出題時始料不及的。沒想到其中要考慮的問題是方方面面錯綜復(fù)
雜,本人也曾幾次在困難面前想要退縮,但為了給大家一個較滿意的答案,還是
硬著頭皮寫了下來??磥砼幚碇贿m合做它適合做的事,想人為強(qiáng)加給它其他的
功能的確是費(fèi)力不計好。
更多相關(guān)
批處理函數(shù):大數(shù)字加減乘除、時期時間計算、數(shù)字排序、進(jìn)制轉(zhuǎn)換等
合理使用位運(yùn)算可以簡化代碼、提高效率
位運(yùn)算相關(guān)概念及批處理演示
https://www.jb51.net/article/222968.htm
https://www.jb51.net/article/222971.htm
對于超大數(shù)、浮點數(shù)的計算,BAT調(diào)用VBS或PowerShell是相對簡單的解決方法。
截取日期、時間之后進(jìn)行 set /a 計算時08和09會被看做非法八進(jìn)制數(shù)字,參考:
https://www.jb51.net/article/222980.htm
https://www.jb51.net/article/222991.htm
五、使用 set 命令進(jìn)行字符串截取
原始字符串 字符串截取 set sub=%str:~x,y%
結(jié)果
截取第一個到第三個字符
set str=12345
set sub=%str:~0,3%
截取第二個到最后一個字符
set str=12345
set sub=%str:~1%
截取倒數(shù)第四個到倒數(shù)第二個字符
set str=12345
set sub=%str:~-4,3%
set sub=%str:~-4,-1%
截取最后兩個字符
set str=12345
set sub=%str:~-2%
說明
當(dāng)x為正數(shù)時,表示從左到右截??;當(dāng)x為負(fù)數(shù)時,表示從右到左截取。
當(dāng)y為正數(shù)時,表示要截取后字符串的長度;當(dāng)y為負(fù)數(shù)時,表示要拋棄的最后幾個字符長度。
當(dāng)y及其之前的逗號不存在時,表示截取的是第x+1個字符及其之后的所有字符。
六、使用 set 命令進(jìn)行字符串替換
set StrNew=%StrOld:SubOld=SubNew%
把字符串 bbs 替換成 www
set StrOld=http://bbs.bathome.net
set StrNew=%StrOld:bbs=www%
把字符串 bbs 刪掉
set StrOld=http://bbs.bathome.net
set StrNew=%StrOld:bbs=%
把第一字符 t 及其左側(cè)所有字符全部刪掉(統(tǒng)配符 * 的使用)
set StrOld=http://bbs.bathome.net
set StrNew=%StrOld:*t=%
待替換的子字符串不區(qū)分大小寫(可以利用這個特性實現(xiàn)字母大小寫轉(zhuǎn)換)
@echo off setlocal enabledelayedexpansion REM 全部轉(zhuǎn)換成大寫字母 set str=http://bbs.BATHOME.net set up=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z for %%i in (%up%) do ( set str=!str:%%i=%%i! ) echo %str% pause
全部轉(zhuǎn)換成小寫字母
@echo off setlocal enabledelayedexpansion REM 全部轉(zhuǎn)換成小寫字母 set str=http://bbs.BATHOME.net set low=a b c d e f g h i j k l m n o p q r s t u v w x y z for %%i in (%low%) do ( set str=!str:%%i=%%i! ) echo %str% pause
七、set命令知識點(1)把命令結(jié)果賦值給變量
UNIX/Linux Shell 支持命令替換 Windows BAT 借助重定向或者for語句來實現(xiàn)
PacketLoss=`ping -c 4 127.0.0.1 | grep '%'`
echo $PacketLoss
bat
@echo off REM 利用重定向把命令結(jié)果(單行字符串)賦值給變量 ping 127.0.0.1 | findstr "%%" > "%temp%\ping.txt" set /p PacketLoss=<"%temp%\ping.txt" echo %PacketLoss% pause
shell
PacketLoss=$(ping -c 4 127.0.0.1 | grep '%')
echo $PacketLoss
bat
@echo off REM 利用for語句把命令結(jié)果(單行字符串)賦值給變量 for /f "delims=" %%i in ('ping 127.0.0.1 ^| findstr "%%"') do ( set "PacketLoss=%%i" ) echo %PacketLoss% pause
八、set命令知識點(2)顯示以某字符開頭的變量
直接執(zhí)行 set 命令可以顯示系統(tǒng)環(huán)境變量
命令 set xxx 可以顯示所有以 xxx 開頭的變量
顯示結(jié)果按照變量名進(jìn)行排序
C:\>set xxx1=A
C:\>set xxx3=C
C:\>set xxx2=B
C:\>set xxx
xxx1=A
xxx2=B
xxx3=C
利用“排序”特性的完整代碼演示
@echo off for %%i in (a.txt c.txt b.txt e.txt) do ( set #%%i=%%i ) for /f "tokens=2 delims==" %%i in ('set #') do ( echo %%i ) pause
在解決實際問題中的應(yīng)用
https://www.jb51.net/article/223002.htm
https://www.jb51.net/article/223004.htm
https://www.jb51.net/article/223007.htm
到此這篇關(guān)于批處理BAT腳本中set命令的使用詳解(批處理之家Batcher)的文章就介紹到這了,更多相關(guān)set命令內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。