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转到错误
感谢您的响应,但我正在寻找一种不需要创建临时文件的解决方案(如果可能的话)。