10

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

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

4

3 回答 3

31

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

$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"

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

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

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

有关流和重定向的更多信息,请参阅Get-Help about_Redirection此 Scripting Guy 文章

值得注意的事情:

  • 重定向是在 PowerShell v3 中引入的*>,因此它在 PowerShell v2 及更早版本中不起作用。
  • PowerShell v5 引入了一个新流(信息,流号 6),因为人们一直在滥用Write-Host,因为他们不了解 cmdlet 的用途。
于 2013-07-02T08:47:09.410 回答
6

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

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

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

于 2013-07-02T08:17:23.983 回答
2

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

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

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

澄清

2>&1意味着流 #2 ( stderr ) 将被重定向到流 #1 ( stdout ),因此两个流都将到达$output.

于 2018-01-30T14:46:30.660 回答