PowerShell捕获写主机输出

Dyl*_*mes 3 powershell

我不得不运行Microsoft cmdlet,并使用cmdlet中的Write-Host行将重要的信息写入控制台.

它没有被返回,所以我不能做$ result = Commandlet ...返回一个对我没用的不同值,我真正需要的是打印到命令行开关中的控制台,无论如何我可以'嗅探'或'刮掉控制台以获取我想要的信息?

$result = Test-Cluser
Run Code Online (Sandbox Code Playgroud)

Test-Cluster将打印诸如"HadUnselectedTests","ClusterConditionallyApproved"等内容,但它在.htm报告文件的路径中返回的值.并且.htm报告文件不幸地不包含其中一个状态代码,所以我不能只为它解析.htm文件.

有什么建议?

mkl*_*nt0 9

PSv5 +中:

$result = Test-Cluster 6>&1
Run Code Online (Sandbox Code Playgroud)

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

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


PSv4中:

没有办法捕捉到Write-Host输出的会话.

唯一的解决方法是使用指定为字符串的目标命令启动另一个Powershell实例.注意事项:

  • 这样的调用很慢,
  • 阻止使用原始数据类型传递参数
  • 总是只返回字符串数据(文本行)
  • 返回所有输出流的输出,包括错误输出
$result = powershell -noprofile -command 'Test-Cluster'
Run Code Online (Sandbox Code Playgroud)

请注意,使用脚本块来传递命令(-command { Test-Cluster })将无法工作,因为PowerShell中则使用了序列化和反序列化,以模拟在会话的行为.


可选读取: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
Run Code Online (Sandbox Code Playgroud)

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

  • {n}>允许重定向数字{n}流; 如果{n}省略,1则暗示:

    • 到文件(例如, 3> c:/tmp/warnings.txt
    • 到"无处",即抑制输出(例如3> $null)
    • 到成功输出流(例如3>&1); 注意:只有1这种方式可以定位流.
  • *>针对所有输出流.

注:不同于POSIX样弹(例如bash),该订单重定向表达并没有关系.

因此,以下类似POSIX的shell成语 - 将错误输出重定向到成功流并使原始成功输出静音- 不起作用:

... 2>&1 1>$null # !! NO output in PowerShell
Run Code Online (Sandbox Code Playgroud)

要在PowerShell中实现此目的,您不得重定向1,而是通过其原始流过滤成功的对象.

例证:最后,OP需要以下内容:仅捕获警告输出,而不是常规(成功)输出:

Test-Cluster 3>&1 | Where-Object { $_ -is [System.Management.Automation.WarningRecord] }
Run Code Online (Sandbox Code Playgroud)

来自警告流的对象具有类型[System.Management.Automation.WarningRecord],这是启用上述过滤的内容.

  • 太好了!PSv5 +部分应记录在[about_Redirection]中(https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_redirection?view=powershell-6) (2认同)