人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

批處理BAT腳本中set命令的使用詳解(批處理之家Batcher)

發(fā)布日期:2021-12-13 15:50 | 文章來源:站長之家

一、使用 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+y

3

八進(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處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部