批处理(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
这个运算式的结果。常用的运算符有+(加)
、-(减)
、*(乘)
、/(除)
、() 分组
等。
这里我们用 set 命令写一个简单的除法计算程序作为例子。
@echo off
set /p x=请输入被除数
set /p y=请输入除数
echo 请按任意键开始计算
pause > null
set /a z=x/y
echo %z%
if
Batch 中的 if
语句主要判断:
- 两个数值之间的关系
- 两个字符串是否相等
- 指定的文件是否存在
其基本语法为:
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
[]
符号里的都是可选的内容,他们的作用如下:
-t | Ping 指定的主机,直到停止。 |
-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 | 为特定命令指定参数或命令行开关。 |
参考资料:批处理教程 - 甘小蔗 | 即百度出来的各种教程
如果有写的不对的欢迎指出,我写一遍也是为了方便自己记忆。
共 9 条评论
已阅√
(附:天呐,这让我想起以前只会写批处理的日子)
天呐,这让我想起现在都不会用批处理的我x
博主,代码块没有复制功能吗
目前没有,也不打算弄(←不想便宜伸手党)
博主,这个代码块有bug
谢谢,我知道,我正在排查原因
开学快乐嗷
你个糟左岸,坏滴很
notepad++ 也有黑色背景的主题。。。