【问题标题】:Batch file equivalent of PIPESTATUS相当于 PIPESTATUS 的批处理文件
【发布时间】:2013-12-27 06:29:07
【问题描述】:

在 bash 脚本中,我们可以找到各个命令的退出状态,这些命令通过管道相互传递。
例如在下面的伪代码中:

 $ command1 | command2 | command3

command1command2&command3的退出状态分别可以在${PIPESTATUS[0]}${PIPESTATUS[1]}&${PIPESTATUS[2]}中获取。

另外,可以从$?获取上一条命令(本例中为command3)的退出状态。

如果是windows批处理脚本,我们可以用%ERRORLEVEL%找到最后一个命令的退出状态。因此我会说,在批处理脚本中最接近 $? 的等价物是 %ERRORLEVEL%

批处理脚本中PIPESTATUS 的等价物是什么?如何查看单个命令的退出状态?

【问题讨论】:

标签: batch-file pipe


【解决方案1】:

没有这种动物。如果你想要个人状态,你需要

command1 >tempfile
set status1=%errorlevel%
command2 <tempfile >anothertempfile
set status2=%errorlevel%
command3 <anothertempfile
set status3=%errorlevel%

【讨论】:

  • 嗯...实际上,管道的目的是为第一个命令显示一种进度条。我当前的实现基于this answer。我得到了所需命令的 Windows 二进制文件,但我不知道第一个命令是否失败。
  • +1 这应该是正常的解决方案,因为它简单易懂
【解决方案2】:

我不相信有直接的方法,但你可以为此编写一个帮助程序批处理文件。

pipe.bat

@echo off
set pipeNo=%1
shift
call %1 %2 %3 %4 %5 %6 %7 %8 %9
> piperesult%pipeNo%.tmp echo %errorlevel%

然后你可以调用它

pipe 1 command1 | pipe 2 command2 | pipe 3 command3

这将创建三个文件piperesult&lt;n&gt;.txt,其中包含命令的结果。

【讨论】:

  • 接受这个解决方案,因为这似乎解决了我的要求。谢谢。
  • +1,但如果命令是批处理文件,脚本将不起作用。需要使用 CALL 的 pipeCall 脚本,或者使用/不使用 CALL 的单个管道脚本,具体取决于 /CALL 选项的存在与否。
  • @dbenham 好点,而且通过始终使用CALL 可以轻松解决。顺便提一句。您是否看到对 pipeResults 进行自动编号的可能性?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
相关资源
最近更新 更多