|
|
发表于 2026-3-7 12:46:18
|
显示全部楼层
本帖最后由 redyear2026 于 2026-3-7 12:52 编辑
关于本帖涉及的 '系统命令产生的返回值' 问题,给几点用法心得,仅供批处理脚本造码时的 ‘避雷’ 参考...
windows 系统命令产生的 '错误返回值',至少有三种典型用法如下
一。两个流程链接符 &&,||
二者对返回值的处理方式:&& 执行返回值为零的链接代码,|| 执行返回值不为零的链接代码。简言之,二者可被用于只须判断零或非零两个不同返回值的决策场合,示例代码如下,其中 find ... 用法分别会产生返回值为 0=发现 或 1=未发现
- @echo off
- echo,xyz|find /i "y">nul && echo,发现字符 y || echo,未发现字符 y
- echo,abc|find /i "y">nul && echo,发现字符 y || echo,未发现字符 y
- pause&exit/b
复制代码
二。语法关键字 errorlevel
其对返回值的处理方式:判断返回值是否大于或等于一个设定值。因此用其判断返回值的代码须遵循 '从高值到低值' 的匹配原则,示例代码如下,其中 find ... 分别会产生返回值为 0=发现 或 1=未发现
- @echo off
- echo,xyz|find /i "y">nul & if errorlevel 1 (echo,未发现字符 y) else (echo,发现字符 y)
- echo,abc|find /i "y">nul & if errorlevel 1 (echo,未发现字符 y) else (echo,发现字符 y)
- pause&exit/b
复制代码 关键字 errorlevel 用法特别,但在复合语块如 if,for 内部若不能采用延迟变量时,其仍是有效的备用选项,示例代码如下,其中 xcopy ... 的错误用法会产生返回值=4
- @echo off & set "a=1"
- if defined a (
- xcopy "a/b" "x/y">nul 2>nul
- if errorlevel 4 (echo,找不到文件) else if errorlevel 0 (echo,成功)
- )
- pause&exit/b
复制代码 三。系统变量 %errorlevel%
其对返回值的处理方式:仅保存最新执行命令产生的返回值。在批处理代码中可用于各种逻辑比对,但其在复合语块中的使用须先开启变量延迟 setlocal enabledelayedexpansion,即引用格式为 !errorlevel!,示例代码如下,其中 xcopy ... 的错误用法会产生返回值=4
A:用于复合语块外
- @echo off
- xcopy "a/b" "x/y">nul 2>nul
- if !errorlevel! equ 4 (echo,找不到文件) else if !errorlevel! equ 0 (echo,成功)
- pause&exit/b
复制代码 B:用于复合语块内
- @echo off & set "a=1"
- if defined a (
- setlocal enabledelayedexpansion
- xcopy "a/b" "x/y">nul 2>nul
- if !errorlevel! equ 4 (echo,找不到文件) else if !errorlevel! equ 0 (echo,成功)
- endlocal
- )
- pause&exit/b
复制代码 四。以上三种用法如何择取,本人倾向于多采用系统变量 %errorlevel% 或 !errorlevel!,其用法最灵活;但在复合语块中若不想开启变量延迟,则可退其次选用语法关键字 errorlevel;当只须判断 成(0)与否(≠0) 两值结果时,选用流程链接符 &&,|| 可有助于代码轻量化。
|
|