我必须运行Microsoft cmdlet,并且使用cmdlet中的Write-Host行将重要信息写入控制台。
它没有返回,所以我不能做$ result = Commandlet ... 返回的另一个值对我来说没有用,我实际需要的是打印在Commandlet中的控制台上,是否我可以“嗅探”或“刮擦”控制台以获取我想要的信息?
$result = Test-Cluser
Test-Cluster将打印以下内容:“ HadUnselectedTests”,“ ClusterConditionallyApproved”等。 但是它返回到.htm报告文件路径的值。 而且.htm报告文件不包含这些状态代码之一,因此我也不能只为.htm文件解析。
有什么建议吗?
答案 0 :(得分:6)
在 PSv5 + 中:
$result = Test-Cluster 6>&1
从版本5开始,Write-Host
写入新引入的信息流,该信息流的编号为6
。
6>&1
将该流重定向到成功输出流(编号1
),以便它也可以在$result
中捕获。
在 PSv4-中:
没有 没有方式来捕获Write-Host
输出中的会话 。
唯一的解决方法是使用指定为 string 的目标命令启动Powershell的另一个实例。
注意事项:
Get-Help about_Redirection
$result = powershell -noprofile -command 'Test-Cluster'
请注意,使用 script块传递命令(-command { Test-Cluster }
会 不起作用,因为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