代码之家  ›  专栏  ›  技术社区  ›  Dylan Holmes

powershell捕获写入主机输出

  •  3
  • Dylan Holmes  · 技术社区  · 7 年前

    我必须运行一个微软CMDLET,而重要的信息位是用CMDLET中的一个写主机线写入控制台的。

    它没有返回,所以我不能做$result=commandlet… 返回的另一个值对我没有用处,我实际需要的是打印到commandlet中的控制台中,我是否可以“嗅探”或“刮取”控制台以获取所需的信息?

    $result = Test-Cluser
    

    测试集群将打印诸如:“hadunselectedtests”、“clusterconditionallyapproved”等内容。 但它在.htm报告文件路径中返回的值。 不幸的是,.htm报告文件不包含这些状态代码之一,所以我也不能为它解析.htm文件。

    有什么建议吗?

    1 回复  |  直到 7 年前
        1
  •  8
  •   mklement0    7 年前

    PSV5+ :

    $result = Test-Cluster 6>&1
    

    从第5版开始, Write-Host 写入新引入的信息流,其编号为 6 .

    6>&1 将该流重定向到成功输出流(数字 1 ,以便它也能被捕获 $result .


    PSV4- :

    捕捉方式 写入主机 输出 在行 .

    唯一的 解决办法 是为了 启动另一个powershell实例 将目标命令指定为 一串 .
    Caveats:

    • 这样的召唤是缓慢的,
    • 防止参数与原始数据类型传递
    • 总是只返回 一串 数据(文本行)
    • 从返回输出 全部的 输出流,包括错误输出
    $result = powershell -noprofile -command 'Test-Cluster'
    

    注意,使用 脚本块 传递命令( -command { Test-Cluster } 工作,因为PopeBeSk然后使用序列化和反序列化来模拟会话内行为。


    可选读取:powershell中的输出流以及如何重定向它们:

    获取有关重定向的帮助 讨论所有输出流的列表,它们可以作为 数字 ;自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
    

    请注意,某些流在默认情况下是静默的,需要opt-in来生成输出,可以通过一个首选变量(例如, $VerbosePreference )或公共参数(例如, -Verbose )

    • {n}> 允许重定向号码 {n} 如果 {n} 被省略, 暗示:

      • 文件(例如, 3> c:/tmp/warnings.txt
      • 到“无处”,即抑制输出(例如, 3> $null )
      • 到成功输出流(例如, 3>&1 );注意:仅流 可以通过这种方式锁定目标。
    • *> 目标 全部的 输出流。

    注:与POSIX类外壳不同(例如, bash ) 秩序 属于 倍数 重定向表达式 物质。

    因此,下面类似posix的shell习惯用法-它将错误输出重定向到成功流并使其静音 只有 这个 起初的 成功输出-不起作用:

    ... 2>&1 1>$null # !! NO output in PowerShell
    

    要在powershell中实现这一点,您不能重定向 而取而代之 滤波器 成功的对象由它们的源流而来。

    案例说明:最后,OP希望得到以下信息: 仅捕获警告输出 ,没有常规(成功)输出:

    Test-Cluster 3>&1 | Where-Object { $_ -is [System.Management.Automation.WarningRecord] }
    

    来自警告流的对象具有类型 [System.Management.Automation.WarningRecord] ,这就是启用上述筛选的原因。

    推荐文章