为何PowerShell会话中Information与Warning流的DataAdded事件未触发?
问题原因与解决办法
核心原因
- 偏好变量未在目标执行上下文设置:你在外部会话设置的
$InformationPreference不会自动同步到[PowerShell]实例的执行环境中。Write-Warning和Write-Information的输出是否进入对应流,由当前执行运行空间的偏好变量控制,默认配置下这两个命令的输出不会写入Streams集合,而是直接输出到主机。 - 事件处理的变量作用域问题:事件脚本块中直接引用外部的
$ps变量可能因作用域隔离无法正确指向目标实例,导致无法读取流内容。
修正后的代码
$ps = [PowerShell]::Create("CurrentRunspace") # 绑定Information流事件 $ps.Streams.Information.Add_DataAdded({ $sender.ReadAll().ForEach{ Write-Host ("信息: " + ($_ | Out-String).Trim()) } }) # 绑定Warning流事件 $ps.Streams.Warning.Add_DataAdded({ $sender.ReadAll().ForEach{ Write-Host ("警告: " + ($_ | Out-String).Trim()) } }) # 绑定Error流事件 $ps.Streams.Error.Add_DataAdded({ $sender.ReadAll().ForEach{ Write-Host ("错误: " + ($_ | Out-String).Trim()) } }) # 在脚本块内部设置偏好变量,确保输出进入对应流 $ps.AddScript({ $InformationPreference = 'Continue' $WarningPreference = 'Continue' Write-Information 'Some Information' Write-Warning 'Some Warning' Write-Error 'Some Error' }).Invoke()
修正说明
- 偏好变量内移:在执行脚本块内部设置
$InformationPreference和$WarningPreference,确保命令输出被写入对应的Streams集合,而非直接输出到主机。 - 使用
$sender引用流对象:事件触发时,$sender直接指向当前触发事件的流实例,避免作用域导致的变量引用失效问题。
内容的提问来源于stack exchange,提问作者managerger
相关产品推荐
相关产品推荐

