我必须运行 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/