本文介绍了批处理中启动外部程序和批处理的几种不同方法,以及如何获取命令返回值,最后还介绍了批处理中命令顺序执行的几种方法的区别。

1. start、call 和直接运行

1.1 start

使用 start 命令时,当前批处理不会等待外部程序运行结束,而是继续向下执行。

使用 start 命令运行其他批处理和 windows 命令行程序时,还会创建一个新的命令行窗口,并将在新的窗口中运行新的程序,如:

1
2
3
4
5
6
7
8
9
@echo off
echo 1
start ping baidu.com
echo 2
start notepad.exe
echo 3
start other.bat
echo 4
pause

1.2 call

使用 call 命令时,当前批处理会等待外部程序或批处理运行结束,然后才继续向下执行。并且始终在当前命令行窗口中运行其他批处理和命令行程序。

1.3 直接运行

直接运行与使用 call 命令一样。但直接运行外部批处理时会破坏当前批处理的运行流程,会导致执行流程无法返回到当前批处理继续执行。

1
2
3
4
5
6
7
8
9
@echo off
echo 1
ping baidu.com
echo 2
notepad.exe
echo 3
other.bat
echo 4
pause

上述示例,执行other.bat后,无法返回到当前批处理,从而无法执行echo 4及后面语句。

2. 获取命令的返回值

在 Windows 批处理中,%errorlevel%变量保存着上一个命令的执行结果(即main函数的返回值)。一般来说,0 表示执行成功,非 0 则表示执行失败,具体的非 0 值的含义则取决于具体的命令。

在批处理脚本中,可以根据%errorlevel%的值来进行后续的处理逻辑,例如:

1
2
3
4
5
6
7
8
9
10
11
@echo off
REM 执行一个命令
start un-exist.exe

REM 判断命令执行结果
if %errorlevel% equ 0 (
echo success
) else (
echo failed with: %errorlevel%
)
pause

运行结果如下:

1
2
3
系统找不到文件 un-exist.exe。
failed with: 9059
请按任意键继续. . .

%errorlevel%是上一个命令的执行结果,因此上面例子中的 9059 是 start 命令的结果,而不是 un-exist.exe 返回的结果。

3. 顺序执行

Windows 批处理提供了&&&|||>>>等顺序执行方式,它们区别如下(下面说的执行成功指的是命令返回值为 0):

  • & 顺序执行多条命令,而不管前面命令是否执行成功。
  • && 顺序执行多条命令,当前面命令执行出错,后面的命令将不会执行。
  • || 顺序执行多条命令,直到遇到执行成功的命令。
  • | 管道命令,将前一个命令的执行结果输出到后一个命令 如:help|more
  • > 文件写入命令,清除原文件中的内容后再写入。
  • >> 文件追加写入命令