为什么输出一个[PSCustomObject]会改变执行顺序?



为什么在第二对命令中,在对象输出之前处理Read-Host ?

PS > (1..3).ForEach{ @{ a=$_ } }; Read-Host 'pause1'
Name                           Value                                                                                                          
----                           -----                                                                                                          
a                              1                                                                                                              
a                              2                                                                                                              
a                              3                                                                                                              
pause1: 
PS > (1..3).ForEach{ [PSCustomObject]@{ a=$_ } }; Read-Host 'pause2'
pause2: 
a
-
1
2
3

我肯定这一切才刚刚开始。输出[PSCustomObject]的脚本现在必须在看到输出之前完成。在循环之后但在脚本完成之前进入调试器意味着看不到输出。

不改变执行顺序,但管道中的项保持到命令序列完成后才被释放到默认输出(即显示)。

  1. 输入对Read-Host 'pause2'cmdlet的响应,并注意该响应添加在管道的末尾:
pause2: Test
a
-
1
2
3
Test
  1. 为测试添加一些时间戳:
(1..3).ForEach{ [PSCustomObject]@{ a=(Get-Date).ToString('HH:mm:ss.fffffff') } } ; Read-Host (Get-Date).ToString('HH:mm:ss.fffffff')
15:41:29.1931049:
a
-
15:41:29.1916159
15:41:29.1918194
15:41:29.1919053

解决方案通过使用特定的Write-Hostcmdlet显式强制立即显示管道项:

(1..3).ForEach{ [PSCustomObject]@{ a=$_ } } |Write-Host; Read-Host 'pause2'
@{a=1}
@{a=2}
@{a=3}
pause2:

最新更新