有人可以为Powershell解释这个奇怪的PSObject +添加成员行为吗?

时间:2011-04-21 19:39:58

标签: powershell

我只是不明白为什么会这样。如果我创建两个单独的新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说这是谎言。

发生了什么事?

3 个答案:

答案 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