Windows 捕获命令的输出并检查批处理脚本中的错误级别

Windows 捕获命令的输出并检查批处理脚本中的错误级别,windows,batch-file,error-handling,Windows,Batch File,Error Handling,我有一个命令(我们称之为命令),它将打印到标准输出,并且还将根据执行的成功或失败设置ERRORLEVEL。我想从批处理脚本中调用command,该批处理脚本将处理command的输出,但前提是command退出时错误级别为0(即成功)。这样做最好不需要临时文件,也不需要检查命令的输出以推断是否成功 我能够使用for语句捕获命令的输出,但在执行此操作时检查ERRORLEVEL时遇到问题。我试过这样的方法: for /F %%A in ('command') do ( REM The fo

我有一个命令(我们称之为
命令
),它将打印到标准输出,并且还将根据执行的成功或失败设置ERRORLEVEL。我想从批处理脚本中调用
command
,该批处理脚本将处理
command
的输出,但前提是
command
退出时错误级别为0(即成功)。这样做最好不需要临时文件,也不需要检查命令的输出以推断是否成功

我能够使用
for
语句捕获命令的输出,但在执行此操作时检查ERRORLEVEL时遇到问题。我试过这样的方法:

for /F %%A in ('command') do (
     REM The following check does not seem to work
     if ERRORLEVEL 1 goto error
     REM otherwise, do stuff with %%A
)
我还尝试过使用
%errorlevel%
!错误等级(使用setlocal enabledelayedexpansion,但两者都不起作用。

使用如下代码:

@echo off
"command.exe">"%TEMP%\CommandOutput.tmp"
if errorlevel 1 goto Failed

for /F "usebackq" %%A in ("%TEMP%\CommandOutput.tmp") do (
     REM Do stuff with %%A
     echo %%A
)
goto DelTempFile

:Failed
echo There was an error on executing command.

:DelTempFile
if exist "%TEMP%\CommandOutput.tmp" del "%TEMP%\CommandOutput.tmp"
此批处理代码首先运行命令,将标准输出重定向到临时文件文件夹中的文件。接下来,它计算命令的退出代码

如果没有错误,则使用的处理输出

在错误上显示相应的错误消息


最后,在批处理终止之前删除带有捕获输出的临时文件。

问题在于,在
for
命令的
in
子句中执行的命令在单独的
cmd
实例中运行,并且该实例的退出代码不会传播到
do
子句中的代码

如果您需要一个
for
命令来处理输出,并且在
do
子句中需要生成的命令的
errorlevel
,则需要将两者分开并生成一个临时文件

Mofi的答案可能是最快、最简单和更直接的解决方案,而不必涉及外部脚本引擎/powershell

对于大多数代码都包装在
in子句中的解决方案:

@echo关闭
setlocal enableextensions disabledelayedexpansion
rem一些用于测试的命令-根据需要命令/取消注释
设置“command=findstr 2>nul”
rem设置“命令=ping-n 1本地主机”
rem set“command=ping-n 1 localhost | find”TTL^^^=“”
设置“el=”
对于/f“delims=”%%a in('
cmd/v/q/c“set”t^=%temp%\%~nx0.%random%&(>“!t!”(%command%)&echo(!errorlevel!&type“!t!”&del/q”!t!”)
“)如果未定义el(
rem输出中的第一行是已执行命令的退出代码
设置“el=%%a”&如果%%a全球技术法规0转到失败
)否则(
rem处理命令的输出
回声(%%a
) 
退出/b
:失败
回显失败,错误级别为%el%
后藤:eof
基本思想是将errorlevel作为已执行命令输出的第一行,以便我们可以检查它并决定是否需要更多处理


注意:这将无法避免将所有输出加载到内存中。在开始执行
do
子句中的代码之前,
for/f
将加载所有数据,并且在从命令执行过程中删除的文件中检索数据时效率更高(使外交部的回答更快的原因之一)

出于好奇,你听说过PowerShell吗?我听说过,但还没有探索它的威力。在这种情况下,我正试图将上述逻辑合并到现有的批处理脚本中,因此我不希望将所有内容都重写为PowerShell脚本,除非我可以将其用作批处理脚本和脚本之间的接口上面的逻辑。您需要捕获命令输出还是仅捕获退出代码(errorlevel)?您是否尝试过在命令后将其放到行上?
如果%errorlevel%NEQ 0转到错误
感谢您的响应,但我正在寻找一种不需要创建临时文件的解决方案(如果可能的话)。