【问题标题】:Why would outputting a [PSCustomObject] change execution order为什么输出 [PSCustomObject] 会更改执行顺序
【发布时间】:2021-08-09 05:41:26
【问题描述】:

为什么在第二对命令中,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] 的脚本现在必须在看到输出之前完成。在循环之后但在脚本完成之前进入调试器意味着看不到输出。

【问题讨论】:

  • 执行顺序没有改变,但是管道中的项目在被释放到默认输出(即显示)之前一直保持到命令行完成。您可以使用特定的Write-Host cmdlet 强制显示它们:(1..3).ForEach{ [PSCustomObject]@{ a=$_ } } |Write-Host; Read-Host 'pause2'
  • 好的,所以不是执行顺序,但是你的回答并没有解决问题,即对象没有被输出到主机,或者解释为什么当对象时行为不同是一个简单的哈希表。另外,如果它是一个不支持管道 ForEach($i in (1..3)){ [PSCustomObject]@{ a=$_ } } |Write-Host; 的 foreach 循环怎么办?读取主机“pause2”?如果您在循环内有一个断点并希望在整个循环完成之前查看每个对象怎么办?

标签: powershell output


【解决方案1】:

执行顺序不会改变,但管道中的项目会一直保持到命令序列完成,然后才会释放到默认输出 (which is the display)。

证明

  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-Host cmdlet 显式强制管道项立即显示:

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

【讨论】:

  • 好的,所以不是执行顺序,但是您的解决方案没有解决问题,即对象没有输出到主机。如果它是一个不支持管道ForEach($i in (1..3)){ [PSCustomObject]@{ a=$_ } } |Write-Host; Read-Host 'pause2' 的foreach 循环怎么办?如果您在循环内有一个断点并希望在整个循环完成之前查看每个对象怎么办?你也没有解释为什么当对象是一个简单的哈希表时行为会有所不同。
猜你喜欢
  • 2014-02-21
  • 2021-09-19
  • 2021-03-11
  • 2021-08-23
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多