所以这让我绊倒并挠了挠头或一分钟。事实证明,答案非常简单:Select-Object cmdlet 返回一个类型为 的对象Selected.System.Management.Automation.PSCustomObject
。然后将其沿管道传递给以下两个选择,但由于不再有任何匹配的属性(它们从第一个选择中被丢弃) - 没有任何输出。考虑以下示例:
# declare an array and populate it
$results = @()
$results = $results + (New-Object PSobject -Property @{
P1 = "One"
P2 = "Two"
P3 = "Three"
})
$results = $results + (New-Object PSobject -Property @{
P1 = "Uno"
P2 = "Dos"
P3 = "Tres"
})
$results | select P1
$results | select P2
$results | select P3
正如你所描述的,我只是从第一个选择中获得输出。我他们接受了 BartekB 的建议,将其放在| Out-Default
每行的末尾并开始工作。我通过将其替换| Get-Member
为查看被放置在管道上的对象进行了进一步调查:
$results | select -Property P1 | get-member
TypeName: Selected.System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
P1 NoteProperty System.String P1=One
简而言之,Out-Default 需要实际强制它显示在控制台上,而不是将其传递给下一个语句。在交互式 shell 中完成语句时似乎暗示了这种行为,但在完全编写脚本时行为会有所不同。