【问题标题】:Dos inline IF test for errorlevel, without use of Delayed ExpansionDos inline IF 测试错误级别,不使用延迟扩展
【发布时间】:2013-01-19 21:15:45
【问题描述】:

有没有办法在不延迟扩展的情况下执行以下操作(一行,为了便于阅读而中断)?

%comspec% /v:on /c %windir%\System32\reg.exe import c:\temp\test.reg &
 if !errorlevel! neq 0 pause

如果是回显,我知道call 可以使用,但似乎不能与if 一起使用。

【问题讨论】:

    标签: cmd call delayedvariableexpansion


    【解决方案1】:

    您可以使用条件执行: reg.exe import c:\temp\test.reg || pause
    || 表示在失败时执行(即错误级别 neq 0)。

    您可能还想试试这个例子,看看它是如何工作的:

    find "this" && echo found || echo not found - 如果“this”在输入流中,它会通知您(除非您重定向,否则从键盘输入)。

    【讨论】:

    • 嗨 wmz...感谢您的回答,以及有趣的 Find 示例,我尝试过reg.exe import c:\temp\test.reg | find "ERROR:" && echo found || echo not found,但是当它打印在屏幕正上方时,它总是显示not found。猜测管道不是重定向的意思吗?也很抱歉接受 Andriy M 的回答,但认为错误级别的解决方案更适合我的情况。虽然 +1。
    • @user66001 不用担心 :-) 你不需要使用find,你可以直接使用||,就像我(和Andriy M)展示的那样。无论如何,您的 find 不起作用,因为 reg 将错误输出发送到 stderr,并且管道连接 stdout 和 stdin 。要获得所需的结果,您需要稍微玩一下这些流,试试这个:2>&1 reg.exe import c:\temp\test.reg | find /i "ERROR:" >nul && echo found || echo not found
    • 这确实在 cmd.exe 中直接工作,但无法让 lnk 创建/属性框接受命令,因为它在路径中找不到名为 2>&1 的文件。每次更改都有什么技巧可以使这项工作在快捷方式中工作?
    • @user66001 你可以使用reg.exe import c:\temp\test.reg 2>&1 ... 你可以在命令之前或之后放置重定向(第二个更受欢迎,但我发现第一个更容易阅读)。不过我还没有尝试过,如果仍然有问题,您可以随时将其批量放入链接中并参考批次
    • 我明白了,但是我相信问题是嵌套/父 cmd.exe 之一,并且希望有一个独立的解决方案。其他任何人都知道为什么%comspec% /k %windir%\system32\reg.exe import c:\temp\test.reg 2>&1 | find /i "ERROR:" >nul && (echo found) || (echo not found) & pause 会产生找到/未找到,然后在返回命令提示符之前暂停;但是%windir%\system32\reg.exe import c:\temp\test.reg 2>&1 | find /i "ERROR:" >nul && (echo found) || (echo not found) & pause 不执行暂停(窗口闪烁打开)/导致表达式的其他部分失败?
    【解决方案2】:

    一种方法是使用这种旧语法:

    %comspec% ... & if errorlevel 1 pause
    

    在这种情况下,使用了if 语句的特殊变体,用于测试当前错误级别状态。

    另一个选项可能是这样的:

    %comspec% ... || pause
    

    || 命令分隔符是roughly 等价于& if !errorlevel! neq 0,即仅当前一个命令以非零退出代码终止时才会执行后续命令。

    【讨论】:

    • 谢谢 Andriy M - 您能否详细说明“|| 命令分隔符大致相当于...”?
    • 我指的是我曾经从this answer 收集到的一条知识(当时没有指向它的链接)。这可能与您的具体情况无关,但正如我在回答中做出一般性陈述时,我必须考虑各种情况。我现在已经编辑了答案以包含参考。
    • 啊,所以||没有使用errorlevel,但是由于某种原因导致errorlevel在使用后发生了变化。 P.S 为什么 dbenham 在stackoverflow.com/questions/10354016/… 中提到你,而之前问答的任何其他部分似乎都没有提到你?不这么认为,但我有一个可能与此有关的question :)
    • 这是对我现在已删除的评论的回复。我想我在那里展示了一些“测试用例”,在我看来这与 dbenham 的回答相矛盾,而事实上,我只是没有彻底测试它。
    猜你喜欢
    • 2016-03-02
    • 2016-12-12
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2019-03-01
    • 1970-01-01
    相关资源
    最近更新 更多