PowerShell Capture写主机输出

时间:2018-06-19 21:27:37

标签: powershell

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

它没有返回,所以我不能做$ result = Commandlet ... 返回的另一个值对我来说没有用,我实际需要的是打印在Commandlet中的控制台上,是否我可以“嗅探”或“刮擦”控制台以获取我想要的信息?

$result = Test-Cluser

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

有什么建议吗?

3 个答案:

答案 0 :(得分:6)

PSv5 + 中:

$result = Test-Cluster 6>&1

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

6>&1将该流重定向到成功输出流(编号1),以便它也可以在$result中捕获。


PSv4-中:

没有 没有方式来捕获Write-Host输出中的会话

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

  • 这种调用很慢,
  • 防止使用原始数据类型传递参数
  • 总是只返回 string 数据(文本行)
  • 从所有所有输出流返回输出,包括错误输出
$result = powershell -noprofile -command 'Test-Cluster'

请注意,使用 script块传递命令(-command { Test-Cluster } 不起作用,因为PowerShell随后使用序列化和反序列化进行仿真会话中的行为。


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

Get-Help about_Redirection讨论了所有输出流的列表,可以根据它们的 numbers 作为目标;从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)不同, multiple 重定向表达式的 order 不会 问题。

因此,以下类似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],这是启用上面过滤的原因。

答案 1 :(得分:0)

我使用*>而不是>将控制台的所有输出重定向到文件。

答案 2 :(得分:0)

将文本和变量重定向到文件的示例:

""+$set_groups+"ADGroup 集!" | Out-File -FilePath $log_path -Append