[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 14# qixiaobin0715


比如 批处理各命令错误返回值errorlevel一览 问中提到find.exe
  1. FIND.EXE
  2. (a) Target string found (=f0und)                 = ERRORLEVEL 0
  3. (b) Target string missing (=m1ssing)             = ERRORLEVEL 1
  4. (c) find /?                                     = ERRORLEVEL 1
  5. (d) Parameter format not correct                = ERRORLEVEL 2
  6. (e) Specified file to search not found          = ERRORLEVEL 2
  7. (f) Specified file in use + Fail reply          = ERRORLEVEL 2
  8. (g) Drive not ready + Fail reply                = ERRORLEVEL 2
  9. (h) Specified file in use + Abort reply          = ERRORLEVEL 5
  10. (i) Drive not ready + Abort reply                = ERRORLEVEL 5
复制代码


多条退出码相同,如果能通过代码判断细分这些结果,自定义一个退出码,得到的反馈更具体。如第三方工具的退出码,同样也是作者自定义的。(文章比较古老,仅举个例子)
bat小白,请多指教!谢谢!

TOP

回复 13# aloha20200628


   大佬的方法和5、6楼的不是一样的...
if errorlevel 0 当errorlevel 值大于等于0都是成立的,即 errorlevel值为1也是成立。
if errorlevel 1 排除了 errorlevel值为0的情况,所以当 if errorlevel 1 成立,说明上一条命令执行失败了。
bat小白,请多指教!谢谢!

TOP


为探究 ‘在批处脚本中如何可靠使用 errorlevel 判断系统内置或第三方应用的运行结果返回码’,查看了有关人气较高的老帖,其中列出三篇供有兴趣者参考
2008年老帖》https://devblogs.microsoft.com/oldnewthing/20080926-00/?p=20743
2013年老帖》http://steve-jansen.github.io/gu ... 3-return-codes.html
2012年老帖》https://stackoverflow.com/questi ... -windows-batch-file
至此总算有了一个要点小结(仅供参考):
一。订正7楼的说法,errorlevel 其实是系统维护的一个内置变量,用于捕获系统或第三方应用程序的运行结果返回码,与可在批处脚本中自定义的%errorlevel%不是一回事,并与是否在复合语块内使用无关。
二。if errorlevel n 用于判断系统或第三方应用程序的运行结果返回码,应该从非零值起验,如已知 find.exe 的成功/失败返回码=0/1
  1. @echo off &for %%s in ("$$$.txt" "###.txt") do (
  2. echo,%%s|find "#" 2>nul >nul
  3. if errorlevel 1 (echo,"errorlevel = 1") else (echo,"errorlevel = 0")
  4. )
  5. pause&exit/b
复制代码
三。若系统或第三方应用程序的运行结果返回码不止0/1,if errorlevel n 判断式则应从较高值起验,如
      if errorlevel 9 goto ...
      if errorlevel 8 goto ...
四。由于 if errorlevel n 判断式中的 n 是等式判断,故可采用自定义变量 %errorlevel% 自动接收 errorlevel 即时传值并实现不等式判断,但前提是%errorlevel% 未被预先赋值,因此在复合语块中采用此法,就要启用延迟变量 !errorlevel! 而非 %errorlevel%,如
  1. @echo off &setlocal enabledelayedexpansion
  2. for %%s in ("$$$.txt" "###.txt") do (
  3. echo,%%s|find "#" 2>nul >nul
  4. if !errorlevel! neq 0 (echo,"errorlevel /= 0") else (echo,"errorlevel = 0")
  5. )
  6. pause&exit/b
复制代码
五。关于 errorlevel 的不等式判断用法,存在一个捷径,即直接采用 || 和 && 逻辑运算符, 如
  1. @echo off &for %%s in ("$$$.txt" "###.txt") do (
  2. echo,%%s|find "#" 2>nul >nul||(echo,"errorlevel 》失败")&&(echo,"errorlevel 》成功")
  3. )
  4. pause&exit/b
复制代码
1

评分人数

TOP

个人觉得 系统命令、第三方工具、用户自定义 中的 %errorlevel% 仅仅是定义方不一样。
if errorlevel 是特定用法,只判断 大于等于,且自带变量延迟扩展属性,如同set /a ,方便了在复合语句内判断errorlevel值。
bat小白,请多指教!谢谢!

TOP

回复 19# 77七


进程环境变量和脚本内置变量是不一样的,使用set只能定义进程环境变量。
cmd脚本内置变量就有errorlevel,以上个命令的LastRetCode为值。
使用%errorlevel%或!errorlevel!扩展变量首先通过GetEnvironmentStrings获取进程环境变量,如果不存在再获取脚本内置变量。
值得注意的是set /a var=errorleve只会获取进程环境变量。
使用if errorlevel时既不会获取进程环境变量也不会获取脚本内置变量,它直接将后面的数字与LastRetCode进行比较,errorlevel只是if的一个命令参数不是变量名。
1

评分人数

    • 77七: 感谢分享技术 + 1

TOP

本帖最后由 77七 于 2024-8-3 11:12 编辑

回复 20# buyiyang


   谢谢大佬指点!我的理解错误。
大佬,set /a var=errorlevel,我测试了一下,这里的errorlevel好像只是个空值。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. 123 2>nul
  4. call :1
  5. set /a "var=errorlevel" &echo %errorlevel%
  6. echo %var%
  7. endlocal
  8. echo=
  9. setlocal enabledelayedexpansion
  10. 123 2>nul
  11. set /a "var=errorlevel" &echo %errorlevel%
  12. echo %var%
  13. endlocal
  14. pause
  15. :1
  16. exit /b -1
复制代码
bat小白,请多指教!谢谢!

TOP

回复 21# 77七


    这正是我所说的“set /a var=errorleve只会获取进程环境变量”。
然后因为进程环境变量中没有errorlevel变量,所以在算数表达式中就是0。进程环境变量可以通过set查看。

内置变量在启用命令扩展后才能使用,批处理脚本是默认启用的。
不过有一个例外,__cd__变量无论是否启用命令扩展都能使用,并且%或!引用该变量时只会获取内置变量的值;
但使用set /a var=__cd__或set __cd__仍然只会通过GetEnvironmentStrings获取进程环境变量。
  1. @echo off
  2. set __cd__
  3. echo,内置变量__cd__=%__cd__%
  4. echo,设置环境变量&set "__cd__=999"
  5. set __cd__
  6. echo,变量__cd__=%__cd__%
  7. echo,
  8. set /a var=__cd__
  9. set __cd__
  10. echo,%var%
  11. pause&exit
复制代码
关于__cd__变量可以参考https://stackoverflow.com/questions/20156490/why-cant-i-access-a-variable-named-cd-on-windows-7/20169219#20169219
1

评分人数

    • 77七: 感谢分享技术 + 1

TOP

回复 22# buyiyang


   
谢谢大佬指点!

第一次知道有__cd__ 这个变量,还可以这样用,长知识了。
bat小白,请多指教!谢谢!

TOP

if errorlevel 0 (echo,解压成功) else echo,解压失败

应该写成

if %errorlevel%==0 (echo,解压成功) else echo 解压失败
1234567890

TOP

返回列表