【发布时间】:2022-12-18 00:57:19
【问题描述】:
我想知道是否可以订阅当前的 Powershell 会话事件流,以便每次将一些信息/警告/错误等添加到流中时,我都可以将其作为对象读取。我能够订阅上述 3 个流的 DataAdded 事件,但由于某种原因我只能拦截来自 error stream 的事件
$InformationPreference = 'Continue'
$ps = [PowerShell]::Create("CurrentRunspace")
$ps.Streams.Information.Add_DataAdded({
# THE EVENT IS NEVER TRIGGERED
$ps.Streams.Information.ReadAll().ForEach{
Write-Host ($_ | Out-String)
}
})
$ps.Streams.Warning.Add_DataAdded({
# THE EVENT IS NEVER TRIGGERED
$ps.Streams.Warning.ReadAll().ForEach{
Write-Host ($_ | Out-String)
}
})
$ps.Streams.Error.Add_DataAdded({
#WORKS FINE
$ps.Streams.Error.ReadAll().ForEach{
Write-Host ($_ | Out-String)
}
})
$ps.AddScript({
Write-Information 'Some Information'
Write-Warning 'Some Warning'
Write-Error 'Some Error'
}).Invoke()
知道为什么警告和信息流不触发事件吗?
【问题讨论】:
-
这背后的目的是什么? PowerShell 已经提供了用于重定向任何流(进度流除外)的本机机制,例如。 G。
& { Write-Information 'Some Information'; Write-Warning 'Some Warning'; Write-Error 'Some Error' } *>&1 | Out-String -Stream -
@zett42 这个想法是将输出实时流式传输到 WebApplication,消息到达后我需要显示它。您提到的机制几乎符合我的需要,但问题是所有消息都只是字符串,并且不可能从信息中分辨出调试消息。
-
您可以在它们仍然是对象时区分它们:
... *>&1 | ForEach-Object { if( $_ -is [Management.Automation.ErrorRecord] ) { "ERROR: $_" } }。如果您愿意,我可以写一个更完整的示例作为答案。 -
@zett42 是的,你是对的!这是实现我需要的更简单/更好的方法。谢谢!
标签: powershell runspace