5

1.ps1 创建并打印了 2 个对象。但只有一个出现在输出中。这两个对象都出现在以下情况下:
(1)写输出是用 Format-List 完成的
(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:\>
4

3 回答 3

3

我认为这与Format-Table工作方式有关。我认为默认情况下 PowerShell 会选择Format-TableFormat-List在控制台上显示对象,我不确定是如何做出决定的,但显然Format-Table是被选择的。

Format-Table通过获取第一个对象并从中选择属性来工作。对于第一个对象之后的任何对象,它只会填充第一个对象的属性列。

你可能想试试

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

看看这是否能满足您的需求。

于 2013-08-02T17:05:21.563 回答
2

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

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

你会得到这个输出:

PS C:\> .\test.ps1

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

pv1                                 pv2                                 pv3

哇?!o_o

为什么有人会认为这是一个好主意,这超出了我的理解。

于 2013-08-02T17:04:38.813 回答
2

如果您只是想显示信息,则应该使用Write-Host而不是Write-Output. 您想Write-Output在管道中发送数据时使用,不应该用于简单地显示数据。

这是一篇给出更深入答案的帖子:我应该使用哪个:“Write-Host”、“Write-Output”或“[console]::WriteLine”?

从链接:

当您想在管道中发送数据但不一定想在屏幕上显示时,应该使用 Write-Output。如果没有其他东西首先使用它,管道最终会将其写入默认值。当你想要做相反的事情时,应该使用 Write-Host。[console]::WriteLine 本质上是 Write-Host 在幕后所做的。

于 2013-08-02T18:15:25.753 回答