【发布时间】:2020-06-30 00:49:24
【问题描述】:
更新。
在写这个问题时,我错误地假设 InstallUtil 将其状态存储在 %ERRORLEVEL% 变量中,而不是内部值 ERRORLEVEL 中,因为它具有意外行为。我改写了标题,因为它可能会产生误导。有关详细信息,请参阅此 answer 和我在其下方的评论。
(作为旁注,Microsoft doesn't document 退出状态代码,也没有指定是否存在多个错误状态。)
我正在为 Windows 服务编写安装和卸载脚本。我使用 .NET Framework 提供的 InstallUtil。
在SO answer 中,我注意到了这段代码:
cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
installutil.exe "C:\Services\myservice.exe"
if ERRORLEVEL 1 goto error
ERRORLEVEL 检查总是失败。出于好奇,我将上面的测试替换为以下代码:
IF NOT '%ERRORLEVEL%' == '0'
这一次,状态被正确捕获。为什么?
在询问之前我阅读了 ERRORLEVEL is not %ERRORLEVEL%,但我仍然不明白为什么 InstallUtil 会这样。
【问题讨论】:
-
如果在
installutil命令之后立即echo %errorlevel%输出是什么? -
@SomethingDark
-1如果失败,0它会成功。 -
If ErrorLevel 1表示返回的错误代码为1或更大,If Not %ErrorLevel% == 0表示错误大于或小于0。显然,由于-1小于0,后一个命令可以适当地捕获它,而前者则失败。道德是,在要求根据错误代码执行操作之前,先找出命令用于错误代码的内容。 -
如果我遇到了某个命令的问题,我的第一站是查找并阅读有关该特定命令的帮助信息。在东任何调查之前,它不会问其他人。也许可以归咎于睡眠不足,因为对我来说,当我阅读您的问题时,很明显,错误状态代码为负。为了测试我的理论,我要做的第一件事就是做@SomethingDark 要求你做的事情!
-
我没有假设任何事情,@Amessihel。如果它不是
0并且不大于0,那么逻辑调用端口应该假设它小于0或不存在!您无需进行任何搜索,只需一个命令即可找到答案。
标签: batch-file error-handling errorlevel installutil