后缀为bat的文件为批处理(Batch)文件,是DOS/Window系统下的可执行文件。
可使用文本编辑器对批处理文件进行编辑,一个文件中可存放多条命令行语句,双击即可运行。
本文不对批处理文件命令做系统介绍,仅提供一些基础的使用经验。
输出/打印
采用echo命令进行输出,如
echo Hello World
pause 这条命令让执行过程暂停,否则命令执行完成后窗口自动关闭,无法看清输出内容
每个echo语句输出单行文本,可使用如下方式输出空行:
echo= echo, echo;
echo+ echo/ echo[ echo]
echo: echo. echo\
输出特殊字符(例如&或>时),需要在字符前加上转义字符^,如
错误示例:echo Tom&Jerry
正确示例:echo Tom^&Jerry
批处理文件在执行命令时,会将命令语句本身打印出来,称为回显。
echo off 关闭回显,注意这里不再打印命令语句本身,并不会影响echo命令的输出内容
echo on 打开回显
顺带一提,也可直接在命令语句前加入**@**符号,来关闭单条命令的回显,如
@echo Can you see the command itself?
pause
变量
批处理文件中的变量本身不具有数据类型,可以认为默认情况下同属于字符串类型,只有在特殊操作(例如数值运算)时临时进行类型转换。采用set命令对变量赋值,如
set var_name=var_value
采用双%获取变量的值,如
echo var_name 输出内容为var_name
echo %var_name% 输出内容为var_value
可采用equ命令进行变量取值的比较,如
@echo off
set a=Hello
set b=World
if %a% equ %b% (echo a=b) else (echo a!=b)
pause
批处理也提供了简单的字符串替换操作,如
@echo off
setlocal EnableDelayedExpansion
set str=This is an apple
echo %str% 输出内容为This is an apple
set "str=!str:a=A!"
echo %str% 输出内容为This is An Apple
pause
但是%取值的方式会在编译过程中就把变量的值确定下来,如果变量的值在执行过程中发生了变化,也不会反映在%var_name%当中。为了更灵活地使用变量(具体使用场景可参见循环章节),可采用双!来获取变量的值,这种方式称为“变量延迟扩展”。延迟扩展功能在命令行窗口中默认处于开启状态,也可以使用如下语句手动开启或关闭:
setlocal EnableDelayedExpansion 打开延迟扩展功能
setlocal DisableDelayedExpansion 关闭延迟扩展功能
循环
我们使用如下命令输出三行Hello:
@echo off
for /l %%i in (1,1,3) do (echo Hello)
pause
需要注意的是,for循环中所采用的变量,名称只能包含一个字符,形如%%ii则不可行。其中(1,1,3)中的三个数字分别代表%%i变量的(起始值,变化值,终止值)。与一般的编程语言习惯不同,这里的终止值也包含在循环当中,所以上文的echo Hello命令执行了三次。下面来看如何结合for循环使用变量延迟扩展,例如
@echo off
setlocal EnableDelayedExpansion
set words1=How
set words2=are
set words3=you
for /l %%i in (1,1,3) do (
echo !words%%i!
)
pause
输出内容为"How换行are换行you换行"。若此处使用echo %words%%i%……呃,好像无法解析变量,我也不知道
注释
批处理文件中可使用::添加单行注释,多行注释一般采用goto语句添加,如
@echo off
::This is an annotation
goto annotation_end
Write anything
you would like
to write here
:annotation_end
pause
不推荐在for循环内部使用注释,可能会出错。
文件操作
采用for循环遍历某路径下某种类型的文件:
@echo off
for %%f in (*.txt) do (echo %%f)
pause
采用ren命令重命名文件:
ren oldname.txt "this is a new name.txt"
双引号可以处理路径或文件名中包含空格的情况。