在Windows PowerShell中忽略错误级别!= 0

rip*_*234 11 powershell

我有一个运行外部EXE文件的脚本.当该EXE文件失败时(将errorlevel设置为1),PowerShell脚本将失败.

我正在运行curl.exe并得到这个:

  • CategoryInfo:NotSpecified:(%Total%... Time Current:String)[],RemoteException + FullyQualifiedErrorId:NativeCommandError

如何忽略/捕获外部EXE文件的失败并继续我的脚本?

Kei*_*ill 19

这与EXE返回的退出代码没有任何关系.EXE写入stderr时会生成错误,但仅在ISE内或远程处理或使用后台作业时生成错误.

写入到标准错误的EXE并不会产生与常规PowerShell命令提示符的错误.我不确定为什么会这样.


Col*_*nic 16

实际上,应用程序运行良好 - PowerShell在报告错误时出错.

当应用程序打印到标准错误时,PowerShell有时会断定应用程序已失败.这实际上是PowerShell开发人员做出的设计决策.恕我直言,这是一个错误,因为许多可靠的应用程序(如卷曲)在正常操作过程中将有用信息打印到标准错误.结果是PowerShell只能与其他PowerShell脚本一起使用,并且不能依赖它与其他应用程序进行互操作.


此线程中的其他读者难以重现行为,因为PowerShell不一致地实现它.是否发生NativeCommandError取决于重定向标准错误的方式(因此,错误发生在vanilla PowerShell ISE中,而不是vanilla PowerShell).

无论您对第一段中的设计决策有什么看法,不一致的实现都是针对某些PowerShell错误 - 请参阅PowerShell中的$ LastExitCode = 0但$?= False.将stderr重定向到stdout会产生NativeCommandError.

  • @TessellatingHeckler:40年来,stderr用于“不是常规输出,而是用户的信息”。这允许将标准输出重定向到文件或其他程序,并且仍然可以看到日志输出。stdlog或其他更好的方法吗?是。但是我们被这个名字所困扰。这是几十年来已知的行为。Powershells忽略了这些知识并突然实施了当前行为(以错误的方式)是错误的。为了实际报告错误,有一种叫做返回码的东西。 (4认同)
  • 如果 curl 在没有错误的情况下写入 `standard error`,那么结论一定是 curl 不能很好地与其他应用程序兼容,并且不能依赖于与其他应用程序进行互操作。PowerShell 将错误消息视为善意的错误消息,并不能证明 PowerShell 行为不端且不可靠。 (2认同)