批处理BAT脚本中set命令的使⽤详解(批处理之家
Batcher)
⽬录
⼀、使⽤ set 命令进⾏赋值
1、等号两边不要有空格
2、变量值包含特殊字符需⽤双引号
3、避免使⽤系统环境变量同名的⾃定义变量
4、语法可⾏但不推荐使⽤
⼆、使⽤ set /p 命令读取输⼊
三、使⽤ set /a 命令进⾏数学运算(1)
四、使⽤ set /a 命令进⾏数学运算(2)
五、使⽤ set 命令进⾏字符串截取
六、使⽤ set 命令进⾏字符串替换
七、set命令知识点(1)把命令结果赋值给变量
⼋、set命令知识点(2)显⽰以某字符开头的变量
⼀、使⽤ set 命令进⾏赋值
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' 不是内部或外部命令,也
不是可运⾏的程序或批处理⽂件。
C:\>echo "%str%"
"Bat"
变量值设置为空可以清空变量值,实现变量初始化。
3、避免使⽤系统环境变量同名的⾃定义变量
例如:
path , date , errorlevel 等
4、语法可⾏但不推荐使⽤
使⽤连等把多个变量赋值成数字set /a x=y=100
逗号分隔把多个变量赋值成数字set /a x=1,y=2
上⾯是dos界⾯下的写法,下⾯是批处理中的写法,主意是变量
⽰例1:
显⽰所有的变量的值
@echo off
set
pause
⽰例2:
@echo off
set var=我是值
echo %var%
pause
请看 set var=我是值 ,这就是BAT直接在批处理中设置变量的⽅法!
set 是命令 var是变量名 =号右边的"我是值"是变量的值
在批处理中我们要引⽤这个变量就把var变量名⽤两个%(百分号)扩起来,如%var%⼆、使⽤ set /p 命令读取输⼊
交互获取⽤户输⼊
@echo off
set /p input=请输⼊⼀个字符串:
echo,%input%
pause
读取⽂件的第⼀⾏内容
C:\>echo BatHome&
C:\>set /p input=<"1.txt"
C:\>echo %input%
BatHome
输出字符串之后不产⽣换⾏
@echo off
for %%i in (bat home) do (
echo,%%i
)
pause
输出
bat
home
请按任意键继续. . .
@echo off
for %%i in (bat home) do (
set /p =%%i<nul
)
pause
输出
bathome请按任意键继续. . .
批处理光标回退(⾮cls清屏)动画效果演⽰
@echo off
echo bbs.bathome
set /p =光标回退(⾮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 命令进⾏数学运算(1)等号右侧的变量可以省略百分号
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
⼋进制和⼗六进制转换成⼗进制很简单
C:\>set /a 012
10
C:\>set /a 0xA
10
BAT⽂件⾥⾯进⾏“取余”操作的时候需要使⽤两个百分号
@echo off
set /a n=3%%2
echo %n%
pause
逻辑运算的特殊字符需要使⽤双引号
@echo off
set /a "m=1<<10"
set /a n=1"<<"10
echo %m% %n%
pause
四、使⽤ set /a 命令进⾏数学运算(2)不⽀持直接计算超⼤数(例如磁盘空间的计算)
C:\>set /a n=2147483646+1
2147483647
C:\>set /a n=2147483647+1
-2147483648
C:\>set /a n=2147483648+1
⽆效数字。数字精确度限为 32 位。
C:\>set /a n=-2147483646-1 -2147483647
C:\>set /a n=-2147483647-1 -2147483648
C:\>set /a n=-2147483648-1
⽆效数字。数字精确度限为 32 位。
不⽀持直接计算浮点数
批处理通过⾃⼰编写算法实现浮点计算
题⽬:
输⼊任意两个⼩数(⼩数点后最多为两位数),通过批处理输出两数的和、差、积、商(积、商均保留两位⼩数)
@echo off&setlocal enabledelayedexpansion
set /p str=输⼊的两数为:
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
代码相当复杂,估计⼤家肯定会看得云⾥雾⾥,所以思来想去还
是补充代码编写思路如下,以便理解,同时期待⾼⼈出⼿,给出完美代码:
⼀、总体计算思路
⼤家知道本题最关键是在对⼩数点前后两部分数值的处理上,在楼上⼤家也有
过相关讨论。本⼈认为在加减法的处理上,应该是要将前后数值分开分别进⾏计
算然后再做处理(如后⾯⼩数位和满百位的处理),最后再在中间补上⼩数点。
⽽对乘法,则应是去掉⼩数点后前后位⼀起运算,最后从后向前移位补上⼩数点
。⾄于除法则是最复杂的,如结果要保留两位⼩数,你必须要保证除数的数位⽐
被除数多三位(两数均先去掉⼩数点),当这⼀条件没有得到满⾜时,就要给除
数后⾯补上⾜够的0,最后在结果中从后向前移位补上⼩数点。
⼆、对数值的处理
⼤家可以看到本⼈在代码中使⽤了海量的if语句来做判断,主要是为了处理各
种情况下的数值,⼤致将情况归纳如下⾯的12点:
1 处理原始数值⽆⼩数位的情况--从后⾯补上.00
2 处理原始数值⼩数位不满两位的情况--给⼩数位补上00并提取前⾯的两位
3 处理加减计算时⼩数位⼤于100的情况--⼩数位减去100,整数位加1
4 处理加减计算整数位为负⼩数位⼩于-100的情况--⼩数位加上100,整数位
减1
5 处理加减计算整数位为0⼩数位⼩于0的情况--整数位变为-0,⼩数位去掉负
号
6 处理加减计算整数位为正⼩数位⼩于0的情况--⼩数位加上100,整数位减1
7 处理加减计算⼩数位⼩于10的情况--在⼩数位前⾯加上0
8 处理乘除计算时两数⼩数位均为00的情况--将⼩数位置空
9 处理乘除计算时整数位为0的情况--对⼩数位进⾏取余运算
10 处理乘除计算时结果数位不够⼩数位的情况--在结果值前⾯补上⾜够的0并
从后向前提取⼩数位(如结果为负数还要先取掉负号最后再补上)
11 处理乘除计算时结果⽆⼩数位的情况--在结果后补上.00
12 处理乘除计算时结果⼩数位不⾜两位的情况--在结果后补上0
三、感⾔
在这次编写代码的过程中,本⼈深深感受到批处理在处理数值上的不⾜和缺陷
,这也是本⼈在出题时始料不及的。没想到其中要考虑的问题是⽅⽅⾯⾯错综复杂,本⼈也曾⼏次在困难⾯前想要退缩,但为了给⼤家⼀个较满意的答案,还是
硬着头⽪写了下来。看来批处理只适合做它适合做的事,想⼈为强加给它其他的
功能的确是费⼒不计好。
更多相关
合理使⽤位运算可以简化代码、提⾼效率
位运算相关概念及批处理演⽰
对于超⼤数、浮点数的计算,BAT调⽤VBS或PowerShell是相对简单的解决⽅法。截取⽇期、时间之后进⾏ set /a 计算时08和09会被看做⾮法⼋进制数字,参考:五、使⽤ set 命令进⾏字符串截取
原始字符串字符串截取set sub=%str:~x,y%结果
截取第⼀个到第三个字符
set str=12345
set sub=%str:~0,3%
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论