Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如果一个命令失败,则抑制块的输出(并输出自定义错误消息)_Batch File - Fatal编程技术网

Batch file 如果一个命令失败,则抑制块的输出(并输出自定义错误消息)

Batch file 如果一个命令失败,则抑制块的输出(并输出自定义错误消息),batch-file,Batch File,标题大致概括了这一点,但我将详细阐述我的问题。出于好奇,我一直在将命令放在一个块中(通常只有一个命令不起作用),看看是否可以抑制错误消息并输出一个自定义消息。我尝试了两种方法,第一种失败了,但第二种有效 1. 输出: Blah Blah Blah Blah One of the commands failed. 2. 输出: Blah Blah Blah Blah One of the commands failed. 所以,我回答了问题的第二部分,现在我只需要知道如何(如果其中一个命令

标题大致概括了这一点,但我将详细阐述我的问题。出于好奇,我一直在将命令放在一个块中(通常只有一个命令不起作用),看看是否可以抑制错误消息并输出一个自定义消息。我尝试了两种方法,第一种失败了,但第二种有效

1. 输出:

Blah
Blah
Blah
Blah
One of the commands failed.
2. 输出:

Blah
Blah
Blah
Blah
One of the commands failed.
所以,我回答了问题的第二部分,现在我只需要知道如何(如果其中一个命令失败)抑制除自定义错误消息之外的任何输出。因此,所需的输出将是一个失败的命令。。我该怎么做呢

注意: 我听说你可以做类似于
echo Blah 2>&1nul
之类的事情,我想这是最好的选择。但我也猜这会使它在每次运行命令时都抑制输出,而不仅仅是在出现错误消息时


另外,在你的回答中,如果你能简单解释一下第一个脚本失败的原因,那就太棒了。

非常有趣的话题,但你还没有解决任何问题-你愚弄了自己:-)

我运行了您的代码的一个微小的变化,事情不再像您期望的那样工作了

@echo off
:: clear any existing error
call;

echo %errorlevel%
(
    echo Blah
    ehco Blah & rem Intentional mistake
    echo Blah
) 2>nul||echo One of the commands failed.
echo %errorlevel%

echo(
echo --------------------------
echo(

echo %errorlevel%
call :block 2>nul||echo One of the commands failed.
echo %errorlevel%
exit /b

:block
echo Blah
echo Blah
echo Blah
exit /b
---输出---

通常,
|
之后的命令仅在前一个命令失败时才会激发。
|
运算符通常不直接读取
%ERRORLEVEL%
变量,它通常直接检测先前命令的错误状态

在第一组代码中,其中一个命令失败,ERRORLEVEL设置为9009。但是块中的最后一个命令成功了,因此条件失败消息不会触发

第二段代码使用调用。执行调用时,返回时的当前%ERRORLEVEL%通常用作调用命令的返回状态。在例程输入时,ERRORLEVEL为9009,并且例程中没有任何命令清除错误,因此9009作为CALL语句的错误状态返回。通过在退出/B后将errorlevel指定为附加参数,可以将返回代码强制为任何值。例如,
EXIT/B 0

要弄清楚哪些命令总是设置ERRORLEVEL,哪些命令只有在出现错误时才设置ERRORLEVEL,可能会有点棘手。我相信内部命令只在出现错误时设置ERRORLEVEL,如果命令成功,则不会清除任何先前的ERRORLEVEL。(我假设
.BAT
扩展。我相信
.CMD
扩展会改变行为)

大多数(全部?)外部命令总是设置错误级别。这取决于可执行文件,但大多数外部命令返回0表示成功,返回非零表示失败

由于代码块可能包含内部和外部命令的混合,因此如果任何命令失败,您不能假定最终错误级别为非零。干预的外部命令可能已清除ERRORLEVEL。您应该检查每个命令的返回代码,并设置错误变量以保持块中存在错误。然后,您可以使用“退出”/B显式返回所需的错误代码

我认为只有在所有命令都成功时才打印stdout的唯一方法是将所有stdout重定向到一个临时文件,并密切关注是否有任何命令失败。在块末尾,只有在没有错误的情况下,才可以键入临时文件内容。然后不管怎样删除临时文件。

这是我的测试批处理:

@echo OFF
call :block 2>nul||echo One of the commands failed 1.
call :block2 2>nul||echo One of the commands failed 2.
GOTO :eof

:block
(
    echo Blah
    ehco Blah & rem Intentional mistake
    echo Blah
)
goto :eof
:block2
(
    echo Blah
    echo Blah & rem Intentional mistake
    echo Blah
)
goto :eof
运行此操作将产生

废话 废话 其中一个命令1失败。 废话 废话 废话 其中一个命令失败2

不管它是保存为.bat还是.cmd

我会遵循陈旧的errorlevel理论——在调用BLOCK2子例程之前将errorlevel强制为0,从而解决了这个问题


因此,您获得的行为取决于现有的errorlevel设置-您可能会得到意外的结果…

问题是-第2批是如何失败的?答案可能会让你大吃一惊。试着纠正EHCO,看看你得到了什么…@Peter我不知道它是怎么失败的。当我纠正(故意)输入错误时,它给出了3
blah
s的预期输出,并且没有错误消息。你在这里指的是什么?嗯,无论如何,这是一个有趣的小实验,即使它在人类已知的任何批处理文件中都是不切实际的。哦,不管怎样,谢谢你。
@echo OFF
call :block 2>nul||echo One of the commands failed 1.
call :block2 2>nul||echo One of the commands failed 2.
GOTO :eof

:block
(
    echo Blah
    ehco Blah & rem Intentional mistake
    echo Blah
)
goto :eof
:block2
(
    echo Blah
    echo Blah & rem Intentional mistake
    echo Blah
)
goto :eof