PowerShell 捕获写入主机输出

标签 powershell

我必须运行 Microsoft cmdlet,并且使用 cmdlet 中的 Write-Host 行将重要信息写入控制台。

它没有返回,所以我不能做 $result = Commandlet ...
返回一个对我没用的不同值,我实际需要的内容被打印到命令行开关中的控制台,无论如何我可以“嗅探”或“抓取”控制台以获得我想要的信息?

$result = Test-Cluser

Test-Cluster 将打印以下内容:“HadUnselectedTests”、“ClusterConditionallyApproved”等。
但是它在 .htm 报告文件的路径中返回的值。
不幸的是,.htm 报告文件不包含这些状态代码之一,所以我也不能只解析 .htm 文件。

有什么建议么?

最佳答案

注:至于为什么你不应该使用 Write-Host 输出数据 ,见 this answer .
PSv5+ :

$result = Test-Cluster 6>&1
从版本 5 开始,Write-Host写入新引入的信息流,其编号为6 .6>&1 redirects该流到成功输出流(编号 1 ),以便它也可以在 $result 中捕获.
警告:相关 Out-Host cmdlet 不写入信息流;它的输出 无法捕获 - 见 this answer Write-Host 之间的差异和 Out-Host .

PSv4- :
无法捕获Write-Host session 中输出 .
唯一的解决方法 启动另一个 Powershell 实例 将目标命令指定为字符串。
注意事项:
  • 这样的调用很慢,
  • 防止传递原始数据类型的参数
  • 总是只返回字符串数据(文本行)
  • 从所有输出流返回输出,包括错误输出
  • 有关所有输出流的列表,请参阅 Get-Help about_Redirection

  • $result = powershell -noprofile -command 'Test-Cluster'
    
    请注意,使用脚本 block 来传递命令 (-command { Test-Cluster }) 将不起作用,因为 PowerShell 然后使用序列化和反序列化来模拟 session 中的行为。

    可选阅读:PowerShell 中的输出流以及如何重定向它们:
    Get-Help about_Redirection 讨论了所有输出流的列表,可以通过它们的数字来定位;从 PSv5 开始,这些是:
    1 ... success output stream (implicit output and Write-Output output)
    2 ... error output stream (Write-Error and unhandled errors)
    3 ... warnings (Write-Warning)
    4 ... verbose output (Write-Verbose)
    5 ... debug output (Write-Debug)
    6 ... (v5+) Write-Information and Write-Host output
    
    请注意,某些流默认情况下是静默的,需要通过首选项变量(例如 $VerbosePreference )或通用参数(例如 -Verbose )选择加入以产生输出
  • {n}>允许重定向号码{n}溪流;如果 {n}省略,1暗示:
  • 到一个文件(例如,3> c:/tmp/warnings.txt
  • 到“无处”,即抑制输出(例如,3> $null)
  • 到成功输出流(例如 3>&1 );注意:仅流 1可以这样定位。

  • *>针对所有输出流。

  • 注意:与类似 POSIX 的 shell(例如 bash )不同,多个重定向表达式的顺序无关紧要。
    因此,以下类似 POSIX 的 shell 习惯用法 - 将错误输出重定向到成功流并仅使原始成功输出静音 - 不起作用:
    ... 2>&1 1>$null # !! NO output in PowerShell
    
    要在 PowerShell 中实现此目的,您不能重定向 1而是通过它们的源流过滤成功的对象。
    恰当的例子:最后,OP 想要以下内容:仅捕获警告输出 ,没有常规(成功)输出:
    Test-Cluster 3>&1 | Where-Object { $_ -is [System.Management.Automation.WarningRecord] }
    
    来自警告流的对象的类型为 [System.Management.Automation.WarningRecord] ,这就是启用上述过滤的原因。

    关于PowerShell 捕获写入主机输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50937190/

    相关文章:

    azure - 在 DevOps 中删除 Azure Analysis Services 防火墙规则

    arrays - 如何使用数组作为参数?

    powershell - 通过 Powershell 从 Azure RM 作业获取作业输入参数

    .net - 验证签名的 Word 文档的正确方法是什么?

    Azure函数: Cannot find certificate with this thumbprint in the certificate

    powershell - 使用 Powershell 远程安装 .msi

    VSCode 中的 Powershell 终端编码

    linux - 在主代理而不是从属代理中运行 Jenkins 构建后步骤

    email - 如何使用 PowerShell 将文件附加到电子邮件

    powershell - 使用 Powershell 执行权限更改 ala chmod/attrib