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

标签 powershell

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

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

最佳答案

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

$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 this Scripting Guy article有关流和重定向的更多信息。

    值得注意的事情:
  • *>重定向是在 PowerShell v3 中引入的,因此它在 PowerShell v2 及更早版本中不起作用。
  • PowerShell v5 引入了一个新流( Information ,流编号 6),因为人们一直在滥用 Write-Host因为他们不明白 cmdlet 的用途。
  • 关于powershell - 如何捕获命令抛出的错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17420474/

    相关文章:

    powershell - 如何使用 Register-ObjectEvent 检测 PowerShell 中进程的 MainWindowTitle 的更改?

    windows - 获取设备的连接端口号和集线器号

    powershell - 将列表输出转换为表(对象)

    powershell - PowerShell remove-item成功但抛出异常

    powershell - 为什么 Powershell ISE 显示 Powershell 控制台不显示的错误?

    powershell - 如何使用具有集成安全性的 Powershell 连接 Azure Paas 数据库

    powershell - 使用 powershell 从 Azure 获取经典 VM 的虚拟机位置

    c# - 字符串缺少终止符 : "

    arrays - Powershell数组长度

    Powershell Start-job 同步输出