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

Avi*_*esh 8 powershell

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

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

Ans*_*ers 26

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

$msg = command 2>&1
Run Code Online (Sandbox Code Playgroud)

要么

command 2>error.txt
Run Code Online (Sandbox Code Playgroud)

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

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

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

command 2>"C:\path\to\error.log"
Run Code Online (Sandbox Code Playgroud)

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

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

command >>"C:\path\to\all.log" *>&1
Run Code Online (Sandbox Code Playgroud)

有关流和重定向的更多信息,请参阅Get-Help about_Redirection或阅读此脚本专家文章.

值得注意的事情:

  • *>重定向是使用PowerShell v3中引入的,因此它不会在PowerShell中V2和更早.
  • PowerShell v5引入了一个新的流(信息,流编号6),因为人们一直在滥用,Write-Host因为他们不了解cmdlet的用途.


Dav*_*ant 5

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

$msg = [string] (svn.exe <your parameters here>)
Run Code Online (Sandbox Code Playgroud)

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