缺省情况下,当命令行执行完成时,它应该在执行成功时返回零,或者在执行失败时返回非零。 当批处理脚本在执行失败后返回非零值时,非零值将指示错误代码是什么。 然后,我们将使用错误号来确定错误是什么,并相应地解决它。
以下是常见的退出代码及其说明。
错误代码 | 描述 |
---|---|
0 | 程序顺利执行完成。 |
1 | 函数不正确。指示操作尝试在Windows命令提示符cmd.exe 中执行不可识别的命令。 |
2 | 该系统找不到指定的文件。 表示在指定的位置找不到文件。 |
3 | 该系统找不到指定的路径。 表示找不到指定的路径。 |
5 | 访问被拒绝。 表示用户没有指定资源的访问权限。 |
9009 0x2331 |
程序不被识别为内部或外部命令,可操作程序或批处理文件。 指示在配置操作时命令,应用程序名称或路径拼写错误。 |
错误级别
环境变量%ERRORLEVEL%
包含上次执行的程序或脚本的返回码。
默认情况下,检查ERRORLEVEL
的方法是通过以下代码。
语法
IF %ERRORLEVEL% NEQ 0 (
DO_Something
)
通常在批处理文件的末尾使用命令EXIT / B%ERRORLEVEL%
来返回批处理文件中的错误代码。
批处理文件末尾的EXIT / B
将停止执行批处理文件。
在批处理文件的末尾使用EXIT / B <exitcodes>
来返回自定义返回码。
环境变量%ERRORLEVEL%
包含批处理文件中的最新错误级别,这是最后执行的命令的最新错误代码。 在批处理文件中,使用环境变量而不是常量值总是一个好习惯,因为同一个变量在不同的计算机上被扩展为不同的值。
我们来看看如何从批处理文件中检查错误代码的一个示例。
示例
假设我们有一个名为Find.cmd
的批处理文件,它具有以下代码。 在代码中,我们已经明确提到,如果找不到名为lists.txt
的文件,那么应该将errorlevel
设置为7
。同样,如果要看到变量userprofile
没有定义,那么应该设置errorlevel
代码为9
。
if not exist c:\lists.txt exit 7
if not defined userprofile exit 9
exit 0
假设有另一个名称为App.cmd
的文件,它首先调用Find.cmd
。 现在,如果Find.cmd
返回一个错误,其中它将errorlevel
设置为大于0
,那么它将退出程序。 在下面的批处理文件中,在调用Find.cmd
查找之后,它实际上检查错误级别是否大于0
。
Call Find.cmd
if errorlevel gtr 0 exit
echo “Successful completion”
在上面的程序中,可以有以下情况作为输出 -
- 如果文件
c:\lists.txt
不存在,则控制台输出中将不显示任何内容。 - 如果变量
userprofile
不存在,则控制台输出中将不显示任何内容。 - 如果上述两个条件都通过,则命令提示符中将显示字符串
"Successful completion"
。
循环
在决策章节中,我们已经看到了一个接一个地按顺序执行的语句。 另外,也可以在批处理脚本中改变程序逻辑中的控制流。可将它们分类为如下控制流程。
编号 | 循环 | 描述 |
---|---|---|
1 | while循环实现 | 在批处理脚本中没有直接的while 语句,但是可以通过使用if 语句和标签来实现这个循环。 |
2 | for语句-列表实现 | for 结构为批处理文件提供循环功能。 以下是使用值列表的for 语句的常见结构。 |
3 | 循环遍历范围 | for 语句也可通过一系列的值。 |
4 | 经典for循环实现 | 以下是在大多数编程语言中可用的经典for 语句。 |
5 | break语句实现 | break 语句用于改变任何编程语言中循环内的控制流。 break 语句通常在循环结构中使用,并用于引起最内层循环的立即终止。 |
循环通过命令行参数
for
语句也可以用来检查命令行参数。 下面的例子展示了如何使用for
语句来遍历命令行参数。
示例
@ECHO OFF
:Loop
IF "%1"=="" GOTO completed
FOR %%F IN (%1) DO echo %%F
SHIFT
GOTO Loop
:completed
假设上面的代码存储在名为Test.bat
的文件中。 如果批处理文件将1
,2
和3
的命令行参数传递为Test.bat 1 2 3
,则以上命令将生成以下输出。
1
2
3