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:\>
答案 0 :(得分: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
Wat?! O_o
为什么有人会认为这个好主意超出了我的范围。
答案 1 :(得分:2)
我认为这与Format-Table
的工作方式有关。我认为默认情况下PowerShell会选择Format-Table
或Format-List
来显示控制台上的对象,我不确定如何做出决定,但显然选择了Format-Table
。
Format-Table
通过获取第一个对象并从中选择属性来工作。对于第一个对象之后的任何对象,它只会填充第一个对象的属性列。
您可能想尝试
.\1.ps1 | % { $_ | ft }
看看那是不是你要找的东西。
答案 2 :(得分:2)
如果您只是想显示信息,则应该使用Write-Host
而不是Write-Output
。您希望在管道中发送数据时使用Write-Output
,而不应仅用于显示数据。
这篇帖子提供了更深入的答案:Which should I use: "Write-Host", "Write-Output", or "[console]::WriteLine"?
从链接:
当您想要在管道中发送数据时,应使用写入输出,但不一定要在屏幕上显示它。如果没有其他方法首先使用它,管道最终会将其写入out-default。当你想做相反的事情时,应该使用Write-Host。 [console] :: WriteLine本质上就是Write-Host在幕后所做的事情。