Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell-将对象放置在管道上时,以后是否可以再次使用它?_Powershell - Fatal编程技术网

Powershell-将对象放置在管道上时,以后是否可以再次使用它?

Powershell-将对象放置在管道上时,以后是否可以再次使用它?,powershell,Powershell,我有一个对象集合,试图从中返回多组数据。每次我想选择对象的一个属性并对其进行唯一排序时 我遇到的问题是,我只在第一次使用该集合时才得到结果。这让我怀疑,当我将这些对象放到管道上时,它们是否正在被“消耗” 举例说明: $results = getMyCollectionOfObjects $results | select-object property1 | sort-object -unique property1 $results | select-object property2 | s

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

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

举例说明:

$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个不同列表

然而,对我来说,$results值在第一次从中选择时就被“用完”

是这样吗?我该怎么办


希望这是清楚的。

它就是这样滚动的。。。您必须显式地将它们导出到默认值,以消除这种奇怪的行为。否则,它也将尝试显示第2组和第3组的属性1。您从$results中删除了它,因此它返回为空


巴特克

所以这让我绊倒了,抓挠了我的头,或者还有一分钟。答案非常简单: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默认值需要强制它在控制台上显示,而不是传递给下一个语句。在交互式shell中完成一条语句时,似乎暗示了这种行为,但在完全编写脚本时,其行为有点不同。

您所说的“用完”是什么意思?@ShawnMelton我的意思是它不再包含它开始时的对象列表
getMyCollectionOfObjects
do?@manojlds-就问题而言,它返回1个或多个相同类型的对象并不重要。这个问题还意味着每个对象至少有3个属性,分别是property1、property2和property3so。你是说,如果我在三行的末尾加上“| Out Default”,这会使它按我的要求工作吗?是的,这正是我要说的。事实上你不需要最后一个。但是,如果您想在前两个之后“刷新”输出,请将它们推到默认值之外。这似乎可以完成任务,谢谢。现在,我只需要确保我理解它以这种方式工作的原因(可能是资源和性能,但在我看来仍然不一致),但这是一个不同的问题。感谢
Select Object
仅在使用
-Property
参数时返回类型为
PSCustomObject
的对象。如果只使用了
-First
-Last
-Skip
-Index
-Unique
参数,您将恢复原始对象类型。