Cmd Dos内联IF测试错误级别,不使用延迟扩展

Cmd Dos内联IF测试错误级别,不使用延迟扩展,cmd,call,delayedvariableexpansion,Cmd,Call,Delayedvariableexpansion,是否有任何方法可以在不延迟扩展的情况下执行以下操作(一行,为了可读性而中断) 如果是回音,我知道可以使用call,但似乎不能与If一起使用,一种方法是使用此旧语法: %comspec% ... & if errorlevel 1 pause |命令分隔符相当于&if!错误等级!neq 0,即仅当前一个命令以非零退出代码终止时,才执行后续命令。您可以使用条件执行: reg.exe导入c:\temp\test.reg|pause | |表示故障时执行(即错误级别neq 0) 您可能还希望尝试此示例

是否有任何方法可以在不延迟扩展的情况下执行以下操作(一行,为了可读性而中断)


如果是回音,我知道可以使用
call
,但似乎不能与
If

一起使用,一种方法是使用此旧语法:

%comspec% ... & if errorlevel 1 pause

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

您可以使用条件执行:
reg.exe导入c:\temp\test.reg|pause

| |
表示故障时执行(即错误级别neq 0)

您可能还希望尝试此示例以了解其工作原理:


查找“this”和&echo-found | | echo-not-found
-它将通知您输入流中是否有“this”(从键盘输入,除非您重定向)

嗨,wmz。。。感谢您的回答和有趣的查找示例,我尝试了
reg.exe导入c:\temp\test.reg | Find“错误:&&echo found | | echo not found
,但是当它打印在屏幕正上方时,它总是说
not found
。猜测管道不是你所说的重定向?。我也很抱歉接受了安德烈M的回答,但我认为错误级别的解决方案更适合我的情况+1尽管如此。@user66001不用担心:-)您不需要使用
find
,您可以直接使用
|
,如我(和安德烈M)所示。无论如何,由于
reg
将错误输出发送到
stderr
,并且管道将
stdout
stdin
连接,因此您的
find
无法工作。要获得所需的结果,您需要稍微处理一下这些流,请尝试以下操作:
2>&1 reg.exe import c:\temp\test.reg | find/i”错误:“>nul&&echo found | | echo not found
这在cmd.exe中直接起作用,但无法使lnk创建/属性框接受该命令,因为它在路径中找不到名为2>&1的文件。在快捷方式中,每更改一次,有什么诀窍可以让它工作吗?@user66001您可以使用
reg.exe import c:\temp\test.reg 2>&1…
您可以在命令之前或之后放置重定向(第二个命令更受欢迎,但我发现第一个命令更容易阅读)。虽然我还没有尝试过,但如果它仍然是一个问题,您始终可以将它放在批量中,并在您的链接中引用批处理。我看到了,但是我认为问题在于嵌套/parent cmd.exe,并且希望有一个独立的解决方案。其他任何人都知道为什么导入c:\temp\test.reg 2>&1|find/i“错误:“>nul&&(echo-found)|(echo-not-found)&pause
生成已找到/未找到的文件,然后在返回命令提示符前暂停;但是
%windir%\system32\reg.exe导入c:\temp\test.reg 2>&1|find/i”错误:“>nul&&&(echo found)|(echo not found)&pause
不执行暂停(窗口闪烁打开)/导致表达式的其他部分失败?谢谢Andriy M-您能详细说明一下“命令定界符大致相当于…”?我指的是我曾经收集到的一条知识(当时没有链接)。这可能与你的具体情况无关,但由于我在答复中作了一般性发言,我不得不考虑各种情况。我现在编辑了答案以包含参考。啊,所以
|
没有使用
errorlevel
,但由于某种原因,使用后会导致
errorlevel
发生变化。P.S为什么dbenham在问与答之前的任何其他部分都没有提到你,而在中提到你?不这样认为,但我有一个可能与此相关的:)这是对我的评论的回复,现在已删除。我想我在展示一些“测试用例”,在我看来,这似乎与dbenham的答案相矛盾,而事实上,我只是没有彻底测试它。
%comspec% ... & if errorlevel 1 pause
%comspec% ... || pause