批处理(Batch)即批处理脚本,是一种简化的脚本语言,能一次性批量执行多行命令,对文件进行处理。它能被应用在 DOS(Disk Operating System)Windows 系统中。它起源于上世纪的 DOS 系统,拓展名为 .bat(Batch),在 Windows NT 以后的平台中,还加入了拓展名为 .cmd (Command)的批处理文件。

编写工具

  许多工具都能编写 Batch 文件,这里不多列举,就写几个自己比较喜欢的编辑器8

Notepad++

  一款小巧灵活的编辑器,支持多种语言(当然也包括 Batch),功能比较齐全,能帮你快速地开始编写代码,唯一的缺点就是背景太白,疲劳的时候瞎眼。

Notepad

  即记事本。对,我没开玩笑,你可以直接用记事本创建一个 txt 文件,书写好 Batch 命令之后再把拓展名 .txt 改为 .bat/.cmd 即可。不用去下载什么,不用去担心兼容性问题,多好。

Sublime

  界面舒服,黑色背景即使是在晚上疲劳工作也不容易感到不适(但我习惯 Notepad++ 之后就不这么想了 2333)我没有用 Sublime 书写过 Batch 文件,但理论上是可行的。相对其他语言来说,Sublime 的自动修正、补全功能是非常非常 Nice 的~

基本语法

echo

  如果你学过世界上最好的语言(PHP),那么你一定对 echo 熟悉得不行。在 Batch 中,echo 的作用也与 PHP 相类似,它被称作回显命令

  echo 可以像 php 那样回显(输出)信息,语法如下。

echo 我是一条信息
echo 就算 文段 空格 也是完全没问题的

  echo 后加空格应该是比较方便也是比较容易理解的语法了,但你可以将空格替换为其他的特殊字符。

echo Hello World!
echo.Hello World!
echo/Hello World!
echo\Hello World!
echo,Hello World!
echo:Hello World!
echo;Hello World!
echo=Hello World!
echo+Hello World!
echo(Hello World!
echo[Hello World!
echo]Hello World!

  尽管有如此多的形式,但最常用的还是 echo 信息echo.信息
  不过事实上,这几种形式中,效率最高、最不容易出错的是echo, echo; echo=echo.则完全相反。(依据:http://demon.tw/reverse/cmd-internal-echo.html

  默认情况下,批处理文件在执行命令时不仅会回显命令执行后的结果,还会回显命令本身,就像这样:

echo Test
Test

  直接将命令显示出来当然不太好,而且对于 echo 这样的命令来说,还会有些重复的感觉,所以我们可以在命令前面加上一个@来关闭该命令的回显。

@echo Test2

  结果是这样的,不会再显示命令行了,而只剩下命令所执行后的结果。

Test2

  如果每条命令前都要手动加上一个@,那是不是太麻烦了?,我们可以用echo off/on来关闭/开启命令回显。

@echo off
echo 你不会看到命令,因为回显被关闭了
@echo on
echo 你现在能看到命令的,因为回显又被开启了

  如你所见,echo off/on 本身会回显,所以我们书写它们的时候要写上一个@

  echo命令不仅能输出信息,开关命令回显,还能对文件内容进行简单的更改。

echo 文件内容被我替换了>target.txt
echo 文件内容中加上了一条我>>target.txt

  第一行命令直接替换target.txt里的内容为文件内容被我替换了这条文本。第二行命令直接在target.txt文件中加入一行文件内容中加上了一条我

echo 文件内容>文件名
echo 文件内容>>文件名

title

  顾名思义,title命令用于定义该 Batch 文件窗口的标题。

title 我是可爱的标题菌

pause

  pause用于暂停批处理文件执行命令,它和Ctrl+C直接阻止批处理文件运行不一样,它只是暂停,并且用户可以按下任意键让批处理文件继续执行,并且暂停后pause命令还会显示一段文本来提示用户“请按任意键继续...”。

pause

  如果你觉得“请按任意键继续...”这段文本不够沙雕正经,你可以使用pause > null,这样批处理文件就会在不显示任何提示文本的情况下暂停执行,这时你可以使用 echo 输出自定义提示。

@echo off
echo 请脸滚键盘好让文件继续执行 _(:з」∠)_
pause > null

  要自定义提示的情况下,千万不要把输出提示信息的 echo 命令行写在pause > null后面了,不然都暂停了还怎么输出 2333

color 与 mode

  即使是批处理文件也要搞好 UI!!!
  color用于修改该批处理文件的配色,即背景色和文本颜色。这些颜色是用十六进制数值表示的。

0=黑色 1=蓝色 2=绿色 3=湖蓝色
4=红色 5=紫色 6=黄色 7=白色
8=灰色 9=淡蓝色
A=淡绿色 B=淡浅绿色 C=淡红色 D=淡紫色 E=淡黄色 F=亮白色

  color的语法为:

color <背景色><文字色>

  color 07则是默认的黑底白字,注意这两个数值之间不能存在空格。

  mode可以用于定义该批处理文件窗口的大小。

mode con: cols=[num] lines=[num]
mode con cols=[num] lines=[num]

  Batch 窗口的大小可不是你理解到长宽,而是列与行。mode con cols= lines=规定这个 Batch 窗口一个视口最多能显示多少列(cols)和行(lines)的文本,超出这个范围,多余的文本会被隐藏,且不会有滚动条。

  mode还能显示/更改代码页,也就是 DOS 中显示的语言,比如这样就是让 DOS 中显示的语言更改为简体中文。

mode con cp select=936

  mode能更改键盘速度/键盘延迟,语法如下(以下所定义的值是默认设置):

mode con rate=31 delay=1

  若想要查询设备状态(即上面定义的 batch 的大小、代码页、键盘速度/键盘延迟),直接这样输入:

mode con

set

  作为一门脚本语言,变量是必不可少的。set命令用于定义/赋值/读入/运算自定义变量。

  在set之后输入空格,再写一个赋值式,就能给变量进行赋值操作。

set var1=text

  即使是有多个变量一起赋值也完全大丈夫(没问题)。

set var1=var2=var3=text

  假如我们要在 echo 中输出变量的值,那么就这样书写。

echo %var%

设置变量时,有几个点要注意:

  • 变量名中不能含有等号
  • Batch 对于变量名不是大小写铭感的,所以 %var% %Var% %VAR% 是同一个变量
  • 在 for 语句中,Batch 对变量名是大小写铭感的

  Batch 也能与用户进行较为高级的交互,我们可以让用户来设置变量的值

set /p variable=请输入变量的值

  运算是计算机的本行,用 set 也能使其进行运算。

set /a value=1+1

  变量 value 则是 1+1 这个运算式的结果。常用的运算符有+(加)-(减)*(乘)/(除)() 分组 等。

DOS 中,计算只能精确到整数,小数采用四舍五入;计算的有效值范围是 -2147483647 至 2147483647 ,超出无效。

这里我们用 set 命令写一个简单的除法计算程序作为例子。

@echo off
set /p x=请输入被除数
set /p y=请输入除数
echo 请按任意键开始计算
pause > null
set /a z=x/y
echo %z%

if

  Batch 中的 if 语句主要判断:

  1. 两个数值之间的关系
  2. 两个字符串是否相等
  3. 指定的文件是否存在

  其基本语法为:

if %num1% [compare] %num2% [满足比较时执行]
if "%var%"=="string" [var 等于 "string" 时执行]
if EXIST [filename] [filename 指向的文件存在时执行]
if defined %var% [var 变量已经被 set 时执行]

  以上的示例中,[compare]是比较运算符,可以是以下的任何一个。

  • EQU - 等于
  • NEQ - 不等于
  • LSS - 小于
  • LEQ - 小于或等于
  • GTR - 大于
  • GEQ - 大于或等于
      [filename]是指定文件的文件名(绝对路径)。每行最后的[...]都可以替换为其他的命令,即满足条件时执行的命令。

  在if之后加上not,则只有条件返回false(则不满足条件)时才会执行对应操作。

if not %num1% [compare] %num2% [满足比较时执行]
if not "%var%"=="string" [var 等于 "string" 时执行]
if not EXIST [filename] [filename 指向的文件存在时执行]
if not defined var [var 变量已经被 set 时执行]

  按照一下语法书写else,不仅可以定义满足条件时执行的操作,还能在同事定义不满足条件时执行的操作。

if not %num1% [compare] %num2% ([command]) else [command]
if not "%var%"=="string" ([command]) else [command]
if not EXIST [filename] ([command]) else [command]
if not defined var ([command]) else [command]

  还可以结合errorlevel(环境变量)使用if语句。环境变量的初始值为0,当一些命令执行不成功,就会返回一个数值,如1或2...

@echo off
md C:\Temp
if %ERRORLEVEL%==1 echo,目录创建失败
if %ERRORLEVEL%==0 echo,成功创建目录
pause>nul&exit

  其中md命令用于创建目录。

goto

  顾名思义,goto命令用于跳转,我们可以用:标识一个“记录点”,goto可以使我们直接跳转到这个记录点的地方开始运行命令。

@echo off
:cycleStart
echo 重要的事情说不完
goto cycleStart

当程序运行到goto这个地方,就会再次回到cycleStart这个记录点,执行后面的命令,于是这个程序就会不停地输出重要的事情说不完

PS.我在测试这个程序的时候直接被 360 当成恶意软件查杀了哈哈哈哈哈

cls

  估计cls是一个强迫症,只要它一出现屏幕上的所有文本都会消失,用于清屏。

ping

  ping应该是平时大家用得最多的一个 Batch 命令了,它用于校验与远程计算机或本地计算机的连接。通常我们是这样用它的。

ping [远程主机ip/域名]

  其实他还有更加复杂的语法

ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v TOS] [-r count] [-s count] [[-j host-list] | [-k host-list]] [-w timeout] [-R] [-S srcaddr] [-4] [-6] target_name

  []符号里的都是可选的内容,他们的作用如下:

-tPing 指定的主机,直到停止。
-a将地址解析成主机名。
-n count要发送的回显请求数。
-l size发送缓冲区大小。
-f在数据包中设置“不分段”标志(仅适用于 IPv4)。
-i TTL生存时间。
-v TOS服务类型(仅适用于 IPv4。该设置已不赞成使用,且对 IP 标头中的服务字段类型没有任何影响)。
-r count记录计数跃点的路由(仅适用于 IPv4)。
-s count计数跃点的时间戳(仅适用于 IPv4)。
-j host-list与主机列表一起的松散源路由(仅适用于 IPv4)。
-k host-list与主机列表一起的严格源路由(仅适用于 IPv4)。
-w timeout等待每次回复的超时时间(毫秒)。
-R同样使用路由标头测试反向路由(仅适用于 IPv6)。
-S srcaddr要使用的源地址。
-4强制使用 IPv4。
-6强制使用 IPv6。

md 和 rd

  在刚才 if 的一个示例中也提到了 md 命令,它用于创建一个指定的目录。

md [path]

这其中的[path]既可以是绝对路径也可以使相对路径。

  rd 是与 md 相对的命令,它用于删除一个指定的目录。

rd [path]

这其中的[path]既可以是绝对路径也可以使相对路径。

  你可以在 rd 后面加上/s,不仅能删除目录本身,还能删除目录下的所有文件和子目录。若加上/q,则删除时不需要用户确认,直接强制删除。若/q /s参数都没带,那么只要该目录下有文件,删除就会被取消。

del

  del用于删除指定的文件,可以是一个也可以是多个。

del /P /F /S /Q /A[属性] names
参数备注
names指定一个或多个文件或者目录列表。通配符可用来删除多个文件。如果指定了一个目录,该目录中的所有文件都会被删除。
/P删除每一个文件之前提示确认。
/F强制删除只读文件。
/S删除所有子目录中的指定的文件。
/Q安静模式。删除全局通配符时,不要求确认
/A根据属性选择要删除的文件
属性R 只读文件、S 系统文件、H 隐藏文件、A 存档文件、I 无内容索引文件、L 重分析点、- 表示“否”的前缀

其中,除了 names 以外的参数都可以不要

for

  for命令用于给一组指定的文件中的每一个文件都执行特定的操作。

FOR %variable IN (set) DO command [command-parameters]
参数备注
%variable指定一个单一字母可替换的参数。
(set)指定一个或一组文件。可以使用通配符。
command指定对每个文件执行的命令。
command-parameters为特定命令指定参数或命令行开关。

参考资料:批处理教程 - 甘小蔗 | 即百度出来的各种教程
如果有写的不对的欢迎指出,我写一遍也是为了方便自己记忆。