bat语法点滴批处理Set命令详解让你理解set命令.docx
《bat语法点滴批处理Set命令详解让你理解set命令.docx》由会员分享,可在线阅读,更多相关《bat语法点滴批处理Set命令详解让你理解set命令.docx(11页珍藏版)》请在冰点文库上搜索。
bat语法点滴批处理Set命令详解让你理解set命令
bat语法点滴批处理Set命令详解让你理解set命令
2011年05月06日星期五15:
30
1.转义符^
^"="
2.
另外,FOR中的变量已被增强,我们可以使用下列句法来引用变量:
%~I -扩充%I为删除外围"引号(有就删)
%~fI -扩充%I为一个完整的路径
%~dI -仅扩充%I为一个驱动器号
%~pI -仅扩充%I为一个路径
%~nI -仅扩充%I为一个文件名
%~xI -仅扩充%I为一个文件扩展名
%~sI -扩充%I为完整的短名路径
%~aI -扩充%I为文件的属性(ARSH)
%~tI -扩充%I为文件的日期时间(修改时间)
%~zI -扩充%I为文件的大小(字节计)
%~$PATH:
I -◎变量可以是其他的,如:
WinDIR、ProgramFiles等
在环境变量PATH指定的路径中搜索文件,
扩充%I为找到的第一个文件的完整路径;
若未找到文件,则扩充%I为空。
组合扩展参数效果:
%~dpI -仅扩充%I为驱动器号和路径
%~nxI -仅扩充%I为文件名加扩展名
%~fsI -扩充%I为完整的短名路径(同%~sI)
%~dp$PATH:
I -搜索变量PATH中的路径,
仅扩充%I为找到的第一个文件驱动器号和路径。
%~ftzaI -扩充%I为类似DIR命令的输出格式
以上例子中,%I和PATH可用其他有效的变量替代。
%~百分号加波浪线用法是后面必须跟有效的FOR变量名。
推荐使用诸如%I的大写变量名,这样不仅易读且可避免混淆。
◎当然这是因人而异的。
如果是for中的变量例如%%i可以写成%%~ni
网上看了很多的set命令,但对于set/a这类参数不是很详细,脚本之家编辑特从网上收集一些实际的例子等,结合在一起,让大家能快速的理解。
set,E文翻译过来就是“设置”的意思,相当于数学里的“令”。
如:
setX=5,就是令X=5的意思。
set的通常用法示例:
1、set显示环境变量:
如:
在命令行下输入:
set会显示当前所有的系统环境变量
setc会显示所有的以c开头或C开头的变量(也即不区分大小写);
setcom会显示所有的以com开头或COM开头的变量(不区分大小写);
2、set设置环境变量,用法示例:
set表达式,
如:
setstr=ok
就是将变量str的值设置成字符串“OK”
注意:
setstr=ok>
这个在批处理运行过程中会出错,系统会提示:
“命令语法不正确。
”
原因是,因为变量str中的值“ok>”的字符">"为一特殊字符,会被系统当成定向符处理,所以会运行出错,那如果确实要设置这样的变量str,值为"ok>"怎么办呢?
解决办法有二:
将特殊字符转义,转义方法在该特殊字符前加一个“^”,如:
setstr=ok^>(这种方法比较少用,因为没有多少应用价值)
常见的解决办法,在set后面将整个表达式用引号括起来,如:
set"str=>"
3、带参数/a的set数值计算
set的/A参数就是让SET可以支持数学符号进行加减等一些数学运算!
支持的数学运算包含(优先权递减):
()-分组
!
~--一元运算符
*/%-算数运算符
+--算数运算符
<<>>-逻辑移位
&-按位“与”
^-按位“异”
|-按位“或”
=*=/=%=+=-=-赋值
&=^=|=<<=>>=
-表达式分隔符
用法示例:
set/anum=2*10,这样变量num的值将变为:
20
复制代码代码如下:
set/avar=2-1结果是多少呢?
如果你看不到结果就echo%var%.....
set/avar=2*2乘法运算
set/avar=2/2除法运算
set/avar=(1+1)+(1+1)结果等于4看得懂吧!
set/aa=1+1,b=2+1,c=3+1运行后会显示一个4,但我们用
echo%a%%b%%c%后看结果,会发现其他数学运算也有效果!
这就是"斗"号的
作用!
有时候我们需要直接在原变量进行加减操作就可以用这种语法
set/avar+=1这样的语法对应原始语法就是set/avar=%var%+1
都是一样的结果。
对于"逻辑或取余操作符",我们需要把他们用双引号引起来,看例子
复制代码代码如下:
set/avar=1"&"1这样结果就显示出来了,其他逻辑或取余操作符用法
set/avar=1"+"1异运算
set/avar=1"%"1取模运算
set/avar=2"<<"2次方运算
set/avar=4">>"2这个不太记得数学里的叫法....
这些符号也可以用&=^=|=<<=>>=这样的简单用法如
set/avar"&="1等于set/avar=%var%"&"1注意引号
4、带参数/p的set等待用户输入
windows2000和windows是没有choice这个命令,choice的等待用户输入功能就要通过set/p来实现
演示如下:
复制代码代码如下:
@echooff
set/pstr=请输入你想输入的字符:
echo你输入的字符串为:
%str%
pause>nul
set/p的特殊应用(set/p=复制代码代码如下:
@echooff
for/l%%iin(1170)do(
set/p=Ofor/l%%ain(1150)dover>nul
)
pause>nul
注:
代码中用到了一句for/l%%ain(1150)dover>nul,它的目的是利用for循环运行某一命令来达到延时的目的。
5、利用set截取字符保存下面的代码为test.bat运行查看即可。
复制代码代码如下:
@echooff&color1f&remnum=15nums=30
modecon:
cols=80lines=35
set"var=90"
set"num="
set"nums="
rem第一屏舍弃
cls&echo第一屏舍弃
echo\&echo%num%var=%var%&echo\
for/l%%iin(113)docall:
dan%%i
echo\
for/l%%iin(011)docall:
yi%%i
echo\
for/l%%iin(012)docall:
_yi%%i
echo~波浪号后面的数字:
为正数表示舍弃变量的前位;
echo,逗号后面的数字为正数表示取变量的舍弃以后的前几位;
echo,逗号后面为负数表示舍弃变量的后几位
echo\&echo\&pause&color1e
rem第二屏取
cls&echo第二屏取
echo\&echo%num%var=%var%&echo\
for/l%%iin(-1-1-3)docall:
dan%%i
echo\
for/l%%iin(-4-1-6)docall:
er%%i
echo\
call:
_er-8
echo~波浪号后面直接跟负数表示取变量的后几位
echo,逗号后面的数字为正数表示取变量的舍弃以后的前几位;
echo,逗号后面为负数表示舍弃变量的后几位
echo\&echo\&pause&color1f
rem第三屏替换删除
cls&echo第三屏替换删除
set"var=abc:
\123\ef:
g\123\456"hij"789"klm\"
echo\&echo%num%var=%var%
echo\
call:
san
echo=号左边为要替换掉的字符,右边为需替换来的字符
echo=号左边要替换掉的字符前面加个*号,代表第一次出现的字符及其前面的所有字符
echo\
echo=========演示完毕=========按任意键退出==========
pause>nul
exit
:
dan
setshu=%1
if%shu%lss0(setaa=取&setji=最后)elsesetaa=舍弃&setji=前
if"%shu:
~0,1%"=="-"setshu=%shu:
~1%
setstr1=%%var:
~%1%%%num%
setstr2=%aa%var的%ji%%shu%位%nums%
callsetstr3=%%var:
~%1%%%num%
callecho%%str1:
~0,15%%%%str2:
~0,30%%%%str3:
~0,15%%
goto:
eof
:
yi
setshu=%1
if%shu%lss0(setaa=取&setji=最后)elsesetaa=舍弃&setji=前
for/l%%iin(113)do(
setstr1=%%var:
~%1,%%i%%%num%
setstr2=%aa%var的%ji%%shu%位之后取%%i位%nums%
callsetstr3=%%var:
~%1,%%i%%%num%
callecho%%str1:
~0,15%%%%str2:
~0,26%%%%str3:
~0,15%%
if%%i==3echo\
)
goto:
eof
:
_yi
for/l%%iin(-1-1-3)do(
setstr1=%%var:
~%1,%%i%%%num%
setstr2=舍弃var的前%1位和%%i位%nums%
callsetstr3=%%var:
~%1,%%i%%%num%
callecho%%str1:
~0,15%%%%str2:
~0,28%%%%str3:
~0,15%%
if%%i==-3echo\
)
goto:
eof
:
er
setsss=%1
setsss=%sss:
~1%
for/l%%iin(113)do(
setstr1=%%var:
~%1,%%i%%%num%
setstr2=从var的倒数%sss%位开始取%%i位%nums%
callsetstr3=%%var:
~%1,%%i%%%num%
callecho%%str1:
~0,15%%%%str2:
~0,24%%%%str3:
~0,15%%
if%%i==3echo\
)
goto:
eof
:
_er
setsss=%1
setsss=%sss:
~1%
for/l%%iin(-1-1-3)do(
setstr1=%%var:
~%1,%%i%%%num%
setstr2=从var的倒数%sss%位开始并舍弃最后%%i位%nums%
callsetstr3=%%var:
~%1,%%i%%%num%
callecho%%str1:
~0,15%%%%str2:
~0,20%%%%str3:
~0,15%%
if%%i==-3echo\
)
goto:
eof
:
san
setstr1=%%var:
"=%%%num%
setstr2=删除var中的所有^"号%num%
setstr3=%var:
"=%%nums%
callecho%%str1:
~0,13%%%%str2:
~0,23%%%%str3:
~0,30%%
setstr1=%%var:
\=%%%num%
setstr2=删除var中的所有\号%num%
setstr3=%var:
\=%%nums%
callecho%%str1:
~0,13%%%%str2:
~0,23%%%%str3:
~0,30%%
setstr1=%%var:
:
=%%%num%
setstr2=删除var中的所有:
号%num%
setstr3=%var:
:
=%%nums%
callecho%%str1:
~0,13%%%%str2:
~0,23%%%%str3:
~0,30%%
echo\
setstr1=%%var:
"=好%%%num%
setstr2=替换var中的所有^"号为好字%num%
setstr3=%var:
"=好%%nums%
callecho%%str1:
~0,12%%%%str2:
~0,20%%%%str3:
~0,30%%
setstr1=%%var:
\=好%%%num%
setstr2=替换var中的所有\号为好字%num%
setstr3=%var:
\=好%%nums%
callecho%%str1:
~0,12%%%%str2:
~0,20%%%%str3:
~0,30%%
setstr1=%%var:
:
=好%%%num%
setstr2=替换var中的所有:
号为好字%num%
setstr3=%var:
:
=好%%nums%
callecho%%str1:
~0,12%%%%str2:
~0,20%%%%str3:
~0,30%%
echo\
setstr1=%%var:
*"=%%%num%
setstr3=%var:
*"=%%nums%
echo删除var中的第一次出现的^"号及其前面的所有字符
callecho%%str1:
~0,15%%%%str3:
~0,30%%
echo.
setstr1=%%var:
*\=%%%num%
setstr3=%var:
*\=%%nums%
echo删除var中的第一次出现的\号及其前面的所有字符
callecho%%str1:
~0,15%%%%str3:
~0,30%%
echo.
setstr1=%%var:
*:
=%%%num%
setstr3=%var:
*:
=%%nums%
echo删除var中的第一次出现的:
号及其前面的所有字符
callecho%%str1:
~0,15%%%%str3:
~0,30%%
echo\
setstr1=%%var:
*"=ppp%%%num%
setstr3=%var:
*"=ppp%%nums%
echo替换var中的第一次出现的^"号及其前面的所有字符为ppp
callecho%%str1:
~0,15%%%%str3:
~0,30%%
echo.
setstr1=%%var:
*\=ppp%%%num%
setstr3=%var:
*\=ppp%%nums%
echo替换var中的第一次出现的\号及其前面的所有字符为ppp
callecho%%str1:
~0,15%%%%str3:
~0,30%%
echo.
setstr1=%%var:
*:
=ppp%%%num%
setstr3=%var:
*:
=ppp%%nums%
echo替换var中的第一次出现的:
号及其前面的所有字符为ppp
callecho%%str1:
~0,15%%%%str3:
~0,30%%
echo\
goto:
eof批处理Set命令详解补充篇
一、设置自定义变量
复制代码代码如下:
@echooff
setvar=我是值
echo%var%
pause
二、设置自定义变量,并接受用户输入作为值
复制代码代码如下:
@echooff
@echooff
set/pvar=请输入变量的值:
if%var%==1echo您输入了1~_~
pause
三、SET/Aexpression
set的/A参数就是让SET可以支持数学符号进行加减等一些数学运算!
支持的数学运算包含(优先权递减):
复制代码代码如下:
()-分组
!
~--一元运算符
*/%-算数运算符
+--算数运算符
<<>>-逻辑移位
&-按位“与”
^-按位“异”
|-按位“或”
=*=/=%=+=-=-赋值
&=^=|=<<=>>=
-表达式分隔符
Batch代码
复制代码代码如下:
set/avar=2-1结果是多少呢?
如果你看不到结果就echo%var%.....
set/avar=2*2乘法运算
set/avar=2/2除法运算
set/avar=(1+1)+(1+1)结果等于4看得懂吧!
set/aa=1+1,b=2+1,c=3+1运行后会显示一个4,但我们用
echo%a%%b%%c%后看结果,会发现其他数学运算也有效果!
这就是"斗"号的作用!
有时候我们需要直接在原变量进行加减操作就可以用这种语法
set/avar+=1这样的语法对应原始语法就是set/avar=%var%+1
都是一样的结果。
对于"逻辑或取余操作符",我们需要把他们用双引号引起来,看例子
Batch代码
复制代码代码如下:
set/avar=1"&"1这样结果就显示出来了,其他逻辑或取余操作符用法
set/avar=1"+"1异运算
set/avar=1"%"1取模运算
set/avar=2"<<"2次方运算
set/avar=4">>"2这个不太记得数学里的叫法....
这些符号也可以用&=^=|=<<=>>=这样的简单用法如
set/avar"&="1等于set/avar=%var%"&"1注意引号
下面是一个具体的例子:
复制代码代码如下:
@echooff
setp=123
title密码是%p%
setn=1
:
in
if%n%gtr3gotowrong
set/pa=请输入您需要登陆的密码:
if"%a%"equ"%p%"gotoright
set/an+=1
gotoin
:
right
echo猜对了,新年快乐!
gotoend
:
wrong
echo已经输过3次了,还不正确,退出!
:
end
pause
四、替换变量值的内容
语法:
setnewVar="oldVar:
str1=str2%
将变量oldVar的值中的str1替换成str2,并将替换后的变量值赋给newVar.
看例子
复制代码代码如下:
@echooff
seta=
echo替换前的值:
"%a%"
setvar=%a:
bbs=sss%
echo替换后的值:
"%var%"
pause
对比一下,我们发现他把变量%a%的bbs给替换掉了,换成了sss.
五、字符串截取
1、%Var:
~start,len%
注意:
从0开始。
例如:
复制代码代码如下:
@echooff
seta=
setvar=%a:
~1,2%
echo%var%
pause
2、%Var:
~-len%
截取倒数len位
3、%Var:
~0,-len%
截取从第一位开始,倒数第len位结束的值。
例子
复制代码代码如下:
@echooff
seta=
setvar=%a:
~0,-3%
echo%var%
pause
执行后,我们发现显示的是"",少了"et"
从结果分析,很容易分析出,这是把变量a的值从0位开始,
到倒数第三位之间的值全部赋予给var
1、利用set/a去掉日期等数字前面的0,如:
2007-09-25中月份中的09前面的0(当然这个月份是未知的,简单的说就
是不管前面有没有0都要保证去掉):
演示代码:
复制代码代码如下:
@echooff
setDay=1%date:
~5,2%
set/aDay-=100
echo%Day%
pause>nul
另外,还可以(在深入运用时,比前一种更有优势):
复制代码代码如下:
@echooff
set/aday1=%date:
~5,1%,day2=%date:
~6,1%
set/aday=%day1%*10+%day2%
echo%day%
pause>nul
2、利用set/a(数值运算除法中除数不允许出现0)返回值来设置数值运算的进位标志;
演示代码:
@echooff2>nul3>nul
set/anum1=7,num2=2
set/avar=%num1%+%num2%
set/a1/(%var%/10)&&echo大于10||echo小于10
pause>nul
再附一特大数值的加法运算演示代码:
(先补位)
复制代码代码如下:
@echooff&setlocalenabledelayedexpansion
setnum1=697316
setnum2=000
call:
lineupnum1
call:
lineupnum2
set/aflag=0
for/l%%iin(11199)do(
set/avar=!
num1:
~-%%i,1!
+!
num2:
~-%%i,1!
+!
flag!
setvar=0!
var!
setflag=!
var:
~-2,1!
setstr=!
var:
~-1!
!
str!
)
for/f"delims=0tokens=*"%%iin("!
str!
")doecho%%i
pause>nul
:
lineupob