【问题标题】:Retrieving exit status of InstallUtil with ERRORLEVEL使用 ERRORLEVEL 检索 InstallUtil 的退出状态
【发布时间】: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


【解决方案1】:

既然您已经声明 installutil 如果失败则返回 -1,if errorlevel 1 goto error 将永远不会被接收,因为 if errorlevel 1 的意思是“如果 %errorlevel% 为 1 或更高”,而 -1 小于 1 .

if not '%errorlevel%'=='0' 有效,因为 -1 不是 0。

【讨论】:

  • 是的,这现在看起来很明显。我不知何故被说服 InstallUtil 触摸了变量 %ErrorLevel% 而不是设置可通过 ErrorLevel 命令检索的退出状态。可能是因为-1 不是我期望的错误级别的值,因为这是经典的If ErrorLevel N 无法检查的。因此,这意味着链接答案中的示例脚本无法正确检查状态。此外,我没有找到任何有关 InstallUtil 退出状态的文档。
  • 看到-1的错误级别肯定很奇怪,所以它给你带来麻烦也就不足为奇了。
猜你喜欢
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 2016-01-22
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
相关资源
最近更新 更多