我有一组对象,我试图从中返回多组数据。每次我想选择对象的一个属性并对其进行唯一排序。
我遇到的问题是我第一次使用该集合时才会得到结果。这让我想知道这些物品是否被消费了#34;当我把它们放在管道上时。
举例说明:
$results = getMyCollectionOfObjects
$results | select-object property1 | sort-object -unique property1
$results | select-object property2 | sort-object -unique property2
$results | select-object property3 | sort-object -unique property3
据我所知,这应该会产生3个不同的列表,列出三个属性中每个属性的所有可能值。
然而对我而言,结果价值正在被用完"用完了#34;第一次从中选择。
是这种情况,我该怎么办?
希望这很清楚。
答案 0 :(得分:3)
这就是它如何滚动......你必须明确地将它们传递给Out-Default以摆脱那种奇怪的行为。否则它会尝试显示第2和第3组的property1。你从$ results中删除它,所以它变回空白。
HTH 鲍尔泰克
答案 1 :(得分:3)
所以这让我绊倒了,抓了我的头或一分钟。事实证明,答案非常简单: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中完成一个语句似乎暗示了这种行为,但在完全编写脚本时表现得有些不同。