我只是不明白为什么会这样。如果我创建两个单独的新PSObject,它们似乎互相影响。例如,使用以下代码:
$o1 = new-object psobject
$o1 | add-member noteproperty abc 123
$o2 = new-object psobject
$o2 | add-member noteproperty def 456
write-output $o1
write-output $o2
我希望看到abc和def的输出,但我只得到abc:
abc
---
123
如果我改用write-host,就像这样:
write-host $o1
write-host $o2
然后它显示如下输出:
@{abc=123}
@{def=456}
所以根据write-output,$ o2为null / empty,但是write-host说这是谎言。
发生了什么事?
答案 0 :(得分:5)
如果在脚本中输出多个不同的对象,则输出的列取决于管道中的第一个项目。由于第一个PSObject只有一个abc属性,所以第二个对象没有输出任何东西,因为它没有匹配的属性。
P.S。如果一次执行一行,则不会看到此行为。
答案 1 :(得分:5)
如果从控制台运行示例行,您将看不到任何问题。如果您在脚本中运行它们,您将看到一个问题。这是因为Out-Default(在每个管道的末尾)将其格式化决策建立在它看到的第一个对象上。因此,您需要确保不输出多个对象类型。或者如果你是,你需要创建一些处理所有对象类型的格式规则(比如对Get-ChildItem的目录和文件输出所做的)。
答案 2 :(得分:1)
我无法重现您所看到的问题,但我确实注意到写入输出的格式化输出显示了控制台最右侧的对象。我第一次见到它时实际上错过了它。如果我把它管道到格式列表,我得到以下内容。
39 > $o1 = new-object psobject
40 > $o1 | add-member noteproperty abc 123
41 > $o2 = new-object psobject
42 > $o2 | add-member noteproperty def 456
43 >
43 > write-output $o1 | fl
abc : 123
44 > write-output $o2 | fl
def : 456