我不得不运行Microsoft cmdlet,并使用cmdlet中的Write-Host行将重要的信息写入控制台.
它没有被返回,所以我不能做$ result = Commandlet ...返回一个对我没用的不同值,我真正需要的是打印到命令行开关中的控制台,无论如何我可以'嗅探'或'刮掉控制台以获取我想要的信息?
$result = Test-Cluser
Run Code Online (Sandbox Code Playgroud)
Test-Cluster将打印诸如"HadUnselectedTests","ClusterConditionallyApproved"等内容,但它在.htm报告文件的路径中返回的值.并且.htm报告文件不幸地不包含其中一个状态代码,所以我不能只为它解析.htm文件.
有什么建议?
在PSv5 +中:
$result = Test-Cluster 6>&1
Run Code Online (Sandbox Code Playgroud)
从版本5开始,Write-Host写入新引入的信息流,其编号为6.
6>&1将该流重定向到成功输出流(数字1),以便也可以捕获它$result.
在PSv4中:
有没有办法捕捉到Write-Host输出的会话.
唯一的解决方法是使用指定为字符串的目标命令启动另一个Powershell实例.注意事项:
Get-Help about_Redirection$result = powershell -noprofile -command 'Test-Cluster'
Run Code Online (Sandbox Code Playgroud)
请注意,使用脚本块来传递命令(-command { Test-Cluster })将无法工作,因为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.txt3> $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],这是启用上述过滤的内容.
| 归档时间: |
|
| 查看次数: |
1566 次 |
| 最近记录: |