批处理bat

有些命令在执行之后将会返回一定的错误值(errorlevel),可以通过errorlevel的值判断命令执行的状况。这点类似于C语言里面的exit(num),num就是错误代码。

获取返回值errorlevel的方法就是,在执行命令后,立马调用返回值errorlevel,如echo %errorlevel%或者if %errorlevel%==1等命令。

符号%

%:引导参数如%1,在命令行中执行for命令时引导变量,如%a;

%%:

  1 在批处理中执行for命令时引导为题,如%%a;引导自定义变量或环境变量,如%ver%,%userprofile%;

  2 c1 && c2,连接两个命令,当&&前的命令成功时,才执行&&后的命令。

c1 & c2:命令连接字符。比如我要在一行文本上同时执行两个命令,就可以用&命令连接这两个命令。

&:在set/a中是按位与。

变量引用

接用变量名操作变量,通过"%"或"!"来获取变量的值。其中,只有在for语句里面重复对同一变量多次赋值时才需要使用"!",并且在使用"!"调用变量时,要首先“启用延迟环境变量扩充”,启动命令为:SetLocal EnableDelayedExpansion。另外需要说明的是,“启用延迟环境变量扩充”后,所有的"!"都将被视为“取变量值”的特殊符号,即使用"^!"也不能输出符号"!"。若要输出"!",则需要“停用延迟环境变量扩充”,命令为:SetLocal DisableDelayedExpansion

批处理中取变量的值是需要用%或者!的,而在set /a 中,直接用变量名称即可取得变量的值。另外,set支持八进制(数字前缀0)、十进制(数字无前缀)和十六进制(数字前缀0x),且支持不同进制之间的计算,如set /a a=123+0123+0x123,计算及显示结果为十进制。

批处理里面的数值计算功能较弱,只能够进行整型计算,忽略浮点数的小数部分;同时数值计算的范围也受限于系统位数,对于目前较为常见的32位机来说,数值计算能处理的数值范围为 0x80000000h~0x7FFFFFFFh,即-2147483648~+2147483647。

数值计算需要使用set命令,具体格式为“set /a expression”。其中,expression代表计算表达式,计算表达式跟C语言里面的表达式基本上完全一致。set支持的运算符也跟C语言里面的一样,只是没有了増一减一。

echo打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo命令将显示当前回显设置。在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定的文件中。

IF语句

if语句实现条件判断,包括字符串比较、存在判断、定义判断等。通过条件判断,if语句即可以实现选择功能。

1.字符串比较

if语句仅能够对两个字符(串)是否相同、先后顺序进行判断等。其命令格式为:

IF [not] string1 compare-op string2 command1 [else command2]

2.存在判断

存在判断的功能是判断文件或文件夹是否存在。其命令格式为:

IF [NOT] EXIST filename command1 [else command2]

3.定义判断

定义判断的功能是判断变量是否存在,即是否已被定义。其命令格式为:

IF [not] DEFINED variable command1 [else command2]

4.结果判断

masm %1.asm

if errorlevel 1 pause & edit %1.asm

link %1.obj

先对源代码进行汇编,如果失败则暂停显示错误信息,并在按任意键后自动进入编辑界面;否则用link程序连接生成的obj文件,这种用法是先判断前一个命令执行后的返回码(也叫错误码,DOS程序在运行完后都有返回码),如果和定义的错误码符合(这里定义的错误码为1),则执行相应的操作(这里相应的操作为pause & edit %1.asm部分)。

for语句(循环结构)

for语句可以实现类似于C语言里面的循环结构,当然for语句的功能要更强大一点,通过不同的开关可以实现更多的功能。for语句有多个开关,不同开关将会实现不同的功能。

1.无开关

无开关的for语句能够对设定的范围内进行循环,是最基本的for循环语句。其命令格式为:

FOR %%variable IN (set) DO command

其中,%%variable是批处理程序里面的书写格式,在DOS中书写为%variable,即只有一个百分号(%);set就是需要我们设定的循环范围,类似于C语言里面的循环变量;do后面的command就是循环所执行的命令,即循环体。

2.开关/L

含开关/L的for语句,可以根据set里面的设置进行循环,从而实现对循环次数的直接控制。其命令格式为:

FOR /L %%variable IN (start,step,end) DO command

3.开关/F

含开关/F的for语句具有最强大的功能,它能够对字符串进行操作,也能够对命令的返回值进行操作,还可以访问硬盘上的ASCII码文件,比如txt文档等。其命令格式为:

FOR /F ["options"] %%variable IN (set) DO command

其中,set为("string"、'command'、file- set)中的一个;options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一个或多个的组合。各选项的意义参见for /f。一般情况下,使用较多的是skip、tokens、delims三个选项。

4.开关/D或/R

含开关/D或/R的for语句是与目录或文件有关的命令,一般情况下很少使用。含开关/R的命令有时候被用于通过遍历文件夹来查找某一个文件或文件夹,故而列举此例。

含开关/R的for语句举例(文件夹遍历):

FOR /R d: %%i IN (.) DO (

,感叹号其实就是变量百分号(%) 的强化版。之所以要用!而不用%,是因为在for循环中,当一个变量被多次赋值时,%dd%所获取的仅仅是dd第一次被赋予的值;要想刷新dd的值,就必须首先通过命令"setlocal enabledelayedexpansion"来开启延迟变量开关,然后用!dd!来获取dd的值。