前言

在windows平台下,批处理文件(也称脚本文件)常指包含一条或多条命令,且以 .bat 或 .cmd 格式结尾的特殊文件。此类文件可在命令提示下直接调用执行,或者双击该文件执行,系统会自动调用cmd.exe程序,有序执行该文件内的各种命令操作。以达到快速执行一批预定制的命令操作。

文件组成:各种doc命令 + 控制条件组成
文件特点:控制命令及参数不区分大小写

echo 命令

描述:显示消息,或启用或关闭命令回显。
支持形态:

echo on : 开启命令回显(默认)

echo off :关闭命令回显

echo message :显示指定消息

实例:

echo hello world1
echo off
echo hello world2
pause

exit 命令

描述:退出脚本执行,或退出当前终端。
例如:

echo hello world3
pause
exit

rem 命令

描述:用于注释代码或描述说明。所有在 rem 后面的同行字符都被注释为普通字符,程序不执行此部分内容。

实例:

rem echo hello world
pause
exit

除了使用上述 rem 进行注释,还可以使用 :: 小写双冒号进行注释,两者效果一样:

rem echo hello world
:: echo hello world
pause
exit

@ 命令

描述:禁止当前执行命令回显示到终端上。
使用@符时,主要有以下3种形态:

  • @命令 :执行本行命令时,禁止消息回显到终端提示符上(影响本行)。
  • @echo on :配合echo on 使用,表示在执行当前行,以及后续行命令时都回显到终端上(影响多行)。
  • @echo off :配合echo off 使用,表示在执行当前行,以及后续行命令时都禁止回显到终端上(影响多行)。

实例:

:: 执行@行命令时,禁止命令回显到终端提示符上
@echo hello world1
pause
exit

:: 允许@行和以下的所有命令回显到终端提示符上(默认)
@echo on
echo hello world2
echo hello world3
pause
exit

:: 禁止@行和以下的所有命令回显到终端提示符上
@echo off
echo hello world4
echo hello world5
pause
exit

pause 命令

描述:批处理暂定功能,提示并等待用户按任意键确认继续操作。

实例:

echo hello world
pause
echo again print hello world
pause
exit

call 命令

描述:在批处理程序种调用另一个批处理程序。
特点:使用call调用外部批处理程序,当目标程序结束后,自动返回调用处,继而往下执行。如果是直接调用批处理文件,目标批处理结束后,程序中断。

实例:

:: test1.bat 代码
:: 使用 call 调用外部批处理文件,完了自动返回继续执行本批处理
@echo off
call test2.bat
echo contiue hello world
pause
exit
:: test2.bat 代码
@echo off
echo hello world
:: test3.bat 代码
:: 直接调用外部test2.bat批处理文件,完了程序自动退出
:: 此执行效果 >>> 一闪而退
@echo off
./test2.bat
echo contiue hello world
pause
exit

start 命令

描述:用于启动一个应用程序或文件或脚本或目录等(支持超链接连接),如不指定参数,默认打开一个命令提示符窗口。

基础格式:

START ["title"] [/D path] [/WAIT] [/MIN] [/MAX]

常用参数:

  • min: 启动时,最小化窗口
  • max: 启动时,最大化窗口
  • wait: 启动程序,并等待其终止。

以上命令只是列举了常用的几个参数,详细请在提示符下输入 start /? 获得帮助文档信息。其中,中括号[]括着的是可选选项,即可用可不用,反之必须传入对应参数值,否则异常,该规则适合所有的命令。

例如:

start
start /min my.txt
start /max "hello" "C:\Windows\System32\cmd.exe"
start /wait my.txt

choice 命令

描述:该命令可以让用户从我们事先给定的选择列表中做出选择,最终返回用户选择的结果。

完整语法:

CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]

参数说明:

  • C # 创建选择列表,每个字符为一个选项,选项间无序间隔。
  • CS # 控制选择结果区分大小写,默认不区分。
  • N # 等待选择时,隐藏选择列表(通常配合 /M 使用)。
  • M # 描述文本。
  • T # 设定等待选择时间,
  • D # 设定默认选项,当选择超时时,赋予事先安排好的默认选项,选项必须是/C内的值,同时必须配合 /T 使用。

有效选择字符是: a-z、A-Z、0-9 和 128 到 254 的 ASCII 值

实例:

:: 使用默认 [Y,N] 选项卡
choice /c

:: 创建自定义选项卡[Y, N, C, 1, 2, 3]
choice /c abc123

:: 创建选项卡[a,b,c,A,B,C] 并要求区分大小写
choice /c abcABC /cs


:: 创建 [Y, N, C] 选项卡,但隐藏其输出,而是使用描述文本告知用户如何操作
choice /c ync /n /m "确认C,否N,退出C"


:: 创建 y n c 选项卡,并设定 5s 做出选择,否则默认选 n
choice /C ync /T 5 /D n

goto 命令

描述:指定程序跳转到某个位置,然后接着往下执行。(通常配合条件判断使用)

语法格式:

goto label
[...]
:label
执行命令1
...
执行命令N

定义过程:使用 goto 关键字声明程序跳转需求,label 为跳转的标识,该标识可以随意自定义,尽量通俗易懂、有意义,且不与关键字重名即可!
定义 label 后,接着需要声明 label 的起始位置,告知主程序跳转到此处,这时只需在目标命令的前一行,单独使用【:+label】的方式声明即可。

执行过程:执行 goto 时,程序会跳转到对应的 label 位置,然后从 label 位置开始往下执行,如果 label 不存在,程序退出。其过程类似汇编语言的 JMP 等跳转过程。

注意:同一文件里,应有且仅有一个 label 起始标识,如果存在多个起始标识,默认按定义的先后顺序来跳转执行,由于此种逻辑难以理解,应尽量避免此类情况。

实例1:

@echo off
goto id1
echo first execution

:id1
echo second execution
pause
exit

上述执行到 goto 时,主程序直接跳转到 id1 处,然后往下执行,所以这里输出的是 execution second 接着就进入等待状态了。如果将 id1 主体移到 goto 上方,程序就会进入死循环状态。

实例2:

:: 存在重名的起使位置标识
@echo off
:id1
echo three execution
goto id1
echo first execution

:id1
echo second execution
pause
exit

if 命令

描述:用于判断指定的条件是否满足,若满足,则执行该分支的代码,若不满足,执行下一条代码。

基本用法:

if [not] string1==string2 command
if [not] errorlevel number command
if [not] exist filename command

说明:[] 选项为可选项,其它为必要项,有 not 与无 not 意思正好相反。

格式一:

语法:

if string1==string2 command

描述:如果string1测试等于(==)string2 条件满足(真),则执行command,否则(假),不执行,转而执行下一行命令。如果加入 not ,则意思相反。

实例:

@echo off
:: 条件满足,打印 hello world1
if "a" == "a" echo hello world1

:: 条件不满足,不输出 hello world2
if "a" == "b" echo hello world2

:: 结合 goto 使用,当条件为真,跳转到相应代码
@echo off
if "A" == "A" goto id1
echo False
:id1
echo True
pause
exit

格式二:
语法:

if errorlevel number command

描述:如果上一指令的返回码大于或等于number,则条件成立,运行command,否则运行下一行命令。
PS:关于上一指令执行后的返回码如何知道?这里可以先在终端执行目标命令,然后使用echo %errorlevel% 显示返回码即可,这时获得的就是该命令的返回码!

实例:

@echo off
:: 验证返回码
echo hello world
echo %errorlevel%
:: 测试 if
if errorlevel 0 echo return code is %errorlevel%
pause
exit

除了可以使用命令返回码作为判断参考值,我们还可以使用 choice 返回特定值作为参考,例如:

@echo off
choice /n /c 123 /m "please input number:"
if errorlevel 5 echo "%errorlevel% < 5"
if errorlevel 2 echo "%errorlevel% > 2"
if errorlevel 1 echo "%errorlevel% > 1"
pause
exit

运行脚本,然后输入1-3的任意数字,可见输出的均为“输入数字>2 , 输入数字>1”两条数据,其实,这就证明了使用 errorlevel 时,只要返回码大于或等于number的,条件均为真,command 将被执行。
那么有没有办法控制其在指定的大于、大于等于、小于、小于等于、等于、不等于的特定条件时才执行 command 呢?答案是有的。使用 if 提供的关键字即可,如下:

EQU - 等于

NEQ - 不等于

LSS - 小于

LEQ - 小于或等于

GTR - 大于

GEQ - 大于或等于

实例:

@echo off
:start
choice /n /c 12345 /m "please input number [1-5]:"
:: 测试等于
if %errorlevel% equ 3 echo "%errorlevel% = 3"
:: 测试不等于
if %errorlevel% neq 3 echo "%errorlevel% != 3"
:: 测试小于
if %errorlevel% lss 3 echo "%errorlevel% < 3"
:: 测试小于或等于
if %errorlevel% leq 3 echo "%errorlevel% <= 3"
:: 测试大于
if %errorlevel% gtr 3 echo "%errorlevel% > 3"
:: 测试大于等于
if %errorlevel% geq 3 echo "%errorlevel% >= 3"
goto start

拓展:

问题:在比较时能否忽略字符串的大小写?如 "a"=="A" 为真。
答:可以,在if 后加入 /i 参数即可,如下实例:

@echo off
if "a" == "A" echo A True
if /i "b" == "B" echo B True
pause
exit

格式三:
语法:

if [not] exist filename command

描述:如何指定的文件存在(not 表示:不存在),则为"真",执行command,反之为"假",执行下一行命令。

实例:
@echo off
if exist test2.bat echo True
if not exist test3.bat echo no file
pause
exit
最后修改:2022 年 06 月 07 日
如果觉得我的文章对你有用,请随意赞赏