2

我有一组对象,我试图从中返回多组数据。每次我想选择对象的一个​​属性并对其进行唯一排序。

我遇到的问题是我只有在第一次使用该集合时才能得到结果。这让我想知道当我将对象放在管道上时是否正在“消耗”它们。

用一个例子来说明:

$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

据我所知,这应该会导致三个不同的列表,其中包含三个属性中每一个的所有可能值。

但是对我来说,这就像 $results 值在第一次被选择时被“用完”。

是这种情况吗?我应该怎么做?

希望这很清楚。

4

2 回答 2

3

这就是它的滚动方式......你必须明确地将它们传递给 Out-Default 以摆脱这种奇怪的行为。否则,它也会尝试显示第二组和第三组的 property1。您从 $results 中删除了它,所以它返回空白。

HTH 巴特克

于 2012-05-17T01:45:11.230 回答
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 中完成语句时似乎暗示了这种行为,但在完全编写脚本时行为会有所不同。

于 2012-05-17T04:03:29.133 回答