如何捕获命令抛出的错误消息?

时间:2013-07-02 08:04:20

标签: powershell

我正在编写一个PowerShell脚本,我需要捕获它正在抛出的错误消息。注意:根据PowerShell,没有错误,命令执行成功。

例如:我尝试从SVN Link下载软件包。链接实际上不存在。该脚本在控制台上显示错误消息。但是,当我尝试检查$_$?$error时,我没有看到任何错误消息。但是,$LASTEXITCODE返回值1.我需要获得确切的错误消息。

3 个答案:

答案 0 :(得分:22)

如果收到错误消息,则需要捕获错误流:

$msg = command 2>&1

command 2>error.txt

PowerShell将其消息写入不同的流,这些流可以重定向到文件以捕获相应的输出。

  • 流1(默认):常规输出(“STDOUT”)
  • 流2:错误消息(“STDERR”),包括来自外部程序的错误消息
  • 流3:警告信息
  • 流4:详细消息
  • 流5:调试消息
  • 流6:信息消息(仅限PowerShell v5及更新版本)

要捕获文件中的特定流,您需要将流编号重定向到文件名。例如

command 2>"C:\path\to\error.log"

将捕获文件commandC:\path\to\error.log生成的所有错误消息。如果您想要附加到文件而不是每次运行时覆盖它,请使用2>>代替2>

您还可以将其他流与STDOUT组合以处理/重定向所有命令输出:

command >>"C:\path\to\all.log" *>&1

有关流和重定向的详细信息,请参阅Get-Help about_Redirectionthis Scripting Guy article

值得注意的事情:

  • PowerShell v3引入了*>重定向,因此无法在PowerShell v2及更早版本中使用。
  • PowerShell v5引入了一个新流(Information,流号为6),因为人们不断使用Write-Host,因为他们不了解cmdlet的用途。

答案 1 :(得分:5)

假设您的可执行文件名为svn.exe且位于路径上,您可以通过以下方式捕获它发送到控制台的消息:

$msg = [string] (svn.exe <your parameters here>)

然后,您可以解析$ msg字符串以查找所需的信息。

答案 2 :(得分:2)

David Brabants answer的启发,您可以使用此命令将stdout和stderr合并为一个字符串数组:

$output = [string[]] (.\Cli.exe -p $param 2>&1)

它将使用参数Cli.exe执行p。这是可选的。

澄清

2>&1表示流#2( stderr )将被重定向到流#1( stdout ),因此两个流都将到达{{1 }}