为何以下PowerShell代码重复输出信息消息?信息流是否有特殊属性?
为什么PowerShell中Write-Information会重复输出?
这个问题的核心在于Information流独有的双重处理机制,和Verbose、Warning这类流的行为有本质区别,咱们一步步拆解:
1. Write-Information的特殊双路径行为
和Write-Verbose/Write-Warning不同,Write-Information天生有两条输出路径:
- 无论
$InformationPreference设置如何,消息都会进入专门的Information流(Stream 6),这部分内容会被后台作业捕获,直到调用Receive-Job时才会被取出输出。 - 当
$InformationPreference设为Continue(而非默认的SilentlyContinue)时,消息还会直接输出到主机(控制台)。
2. 你的代码触发了两次输出的场景
看你的代码,当前会话和作业内部都设置了$InformationPreference = 'Continue',这就触发了双重输出:
- 作业内部的处理:作业运行时,
Write-Information 'information'因为作业内的偏好设置,会向作业的"内部主机"输出一条消息。但因为是后台作业,这部分输出不会直接弹到你的控制台,而是被作业对象捕获保存。 - 当前会话的处理:当你调用
Receive-Job时,作业捕获的所有流(包括Information流)会被发送到当前会话的对应流中。此时当前会话的$InformationPreference = 'Continue'会再次触发这条消息的主机输出。
最终,同一条信息就被输出了两次。
3. 为什么Verbose/Warning没有这个问题?
Write-Verbose和Write-Warning的行为是单一的:当它们的偏好设置为Continue时,消息只会进入对应的专用流(Verbose流/ Warning流),不会额外输出到主机。作业捕获这些流后,Receive-Job只会输出一次捕获到的内容,不会有重复。
验证结论的小测试
- 如果把当前会话的
$InformationPreference改回默认的SilentlyContinue,即使作业内部保持Continue,你只会看到一次information——作业捕获的Information流会被Receive-Job输出一次,当前会话不会再额外处理。 - 如果作业内部设为
SilentlyContinue,当前会话设为Continue,同样只会看到一次输出——作业只把消息写入Information流,当前会话处理Receive-Job的流时输出一次。
内容的提问来源于stack exchange,提问作者Zergatul
相关产品推荐
相关产品推荐

