C# PowerShell写入输出缺少信息-仅打印第一个对象

C# PowerShell写入输出缺少信息-仅打印第一个对象,c#,powershell,powershell-2.0,C#,Powershell,Powershell 2.0,1.ps1创建并打印了2个对象。但输出中只显示一个。 两个对象都会在以下情况下显示: (1) 使用格式列表完成写入输出 (2) object1有4个以上的属性(因此它会自动进行垂直格式化) 试图理解这种行为背后的原因 PS C:\> cat .\1.ps1 $object1 = New-Object PSObject $object1 | add-member NoteProperty -name pn1 -value pv1 $object1 | add-member NotePrope

1.ps1创建并打印了2个对象。但输出中只显示一个。 两个对象都会在以下情况下显示:
(1) 使用格式列表完成写入输出
(2) object1有4个以上的属性(因此它会自动进行垂直格式化)
试图理解这种行为背后的原因

PS C:\> cat .\1.ps1
$object1 = New-Object PSObject
$object1 | add-member NoteProperty -name pn1 -value pv1
$object1 | add-member NoteProperty -name pn2 -value pv2
$object1 | add-member NoteProperty -name pn3 -value pv3
write-output $object1

$object2 = New-Object PSObject
$object2 | add-member NoteProperty -name npn1 -value npv1
$object2 | add-member NoteProperty -name npn2 -value npv2
$object2 | add-member NoteProperty -name npn3 -value npv3
$object2 | add-member NoteProperty -name npn4 -value npv4
$object2 | add-member NoteProperty -name npn5 -value npv5
$object2 | add-member NoteProperty -name npn6 -value npv6
write-output $object2
PS C:\>
PS C:\> .\1.ps1

pn1                                     pn2                                     pn3
---                                     ---                                     ---
pv1                                     pv2                                     pv3


PS C:\>

我无法解释这种行为,但您可以通过对第一个输出使用显式格式化程序来缓解这种行为,例如:

Write-Output $object1 | Format-Table
看起来,如果没有显式格式,PowerShell会记住隐式应用的表格式,并忽略与此格式不匹配的输出。例如,如果在脚本末尾添加另一个
Write Output$object1

$object1 = New-Object PSObject
...
write-output $object1

$object2 = New-Object PSObject
...
write-output $object2
write-output $object1
$object1=新对象PSObject
...
写入输出$object1
$object2=新对象PSObject
...
写入输出$object2
写入输出$object1
您将获得以下输出:

PS C:\> .\test.ps1

pn1                                 pn2                                 pn3
---                                 ---                                 ---
pv1                                 pv2                                 pv3

pv1                                 pv2                                 pv3
PS C:\>。\test.ps1
pn1 pn2 pn3
---                                 ---                                 ---
pv1 pv2 pv3
pv1 pv2 pv3
欧欧欧


为什么有人会认为这是个好主意。

< P>我认为它与<代码>格式表< /代码>的工作方式有关。我认为默认情况下,PowerShell将选择
格式表
格式列表
在控制台上显示对象,我不确定如何做出决定,但显然选择了
格式表

Format Table
通过获取第一个对象并从中拾取属性来工作。对于第一个对象之后的任何对象,它将仅填充第一个对象的属性列

你可能想试试

 .\1.ps1 | % { $_ | ft }

如果你只是想显示信息,你应该使用
写主机
,而不是
写输出
。当您在管道中发送数据时,您希望使用
写入输出
,而不应仅用于显示数据

以下是一篇文章,给出了更深入的答案:

从链接:

当您希望在管线中发送数据,但不一定希望在屏幕上显示数据时,应使用写入输出。如果没有其他人首先使用它,管道最终会将其写入默认值。如果要执行相反的操作,则应使用Write Host。[控制台]::WriteLine本质上就是Write Host在幕后所做的事情


你想看什么?@StanleyDeBoer第二个对象,很明显。我明白了,我只是不太清楚
格式表
中的列会发生变化。是的,正如我在最初的问题中提到的,格式列表是有效的。我只是想了解为什么没有它,编写控制台是如此困难。如果在下一个对象中找不到相同的道具名称,那么为什么它们不打印第二个对象的属性和值?可能是因为它与第一个对象具有不同的属性集。如果您创建的另一个对象具有与
$object1
相同的属性集(即相同的名称,但不同的值),它将显示得很好。这是否证明可以完全跳过该对象?理想情况下,我希望ob1的道具/val打印出来。。然后是obj2的prop/val。。不要尝试将obj2与obj1的属性合并。因为它们不匹配,所以这是一个不同的对象。我想说,这是大多数人所期望的。我想不起来有任何理由。我也不打算这么做。使用了5种格式的列表。但我想知道,为什么它们会如此愚蠢,以至于不知道第一次和第二次写入输出具有不同的属性名称——因此它们可以/是不同类型的对象。因为大多数时候命令一次输出一种类型的对象(我想不出任何内置命令一次输出多个类型的对象),所以你说的是边缘案件。边缘案例的处理方式通常与您预期的不同,因为在一种情况下正确的行为可能是在另一种情况下错误的行为。啊!!-可能是在从脚本运行时,它们不会混合格式。所以在这里,默认情况下,对象1是Format Table(5个道具)。如果cmdlet在shell上运行,则1的格式为Table,2的格式为List。我希望从脚本运行时会出现相同的行为。这不应该是边缘情况。。我有两个独立的write-output语句。。不在一个写入输出中打印两个对象您使用的是
写入输出
而不是
写入主机
。第一个写入管道,第二个写入控制台,这解释了行为。好的,我遇到这种情况的真实用例-我们实际上需要它管道化,以便其他cmdlet可以使用管道中传递的对象的prop/值。在我看来,从客户的角度来看,write host中的输出格式并不美观。您仍然可以格式化
write host
,使其更美观:)