Get-Member停止PowerShell管道

时间:2015-10-11 20:48:40

标签: powershell

管道对象集合时,gm% { $_ | gm }的结果不同。如何描述这种差异?

例如,我们定义了两个自定义对象$a$b

PS C:\> $a = [PSCustomObject]@{p=1; q=2}
PS C:\> $b = [PSCustomObject]@{r=3; s=4}

将它们汇总到gm时,我们只能获得$a的属性:

PS C:\> $a, $b | gm -MemberType NoteProperty | % { $_.Name }
p
q

将它们汇总到% { $_ | gm }时,我们会按预期获得$a$b的属性:

PS C:\> $a, $b | % { $_ | gm -MemberType NoteProperty } | % { $_.Name }
p
q
r
s

1 个答案:

答案 0 :(得分:0)

当数组中相同类型的对象没有匹配的属性时,Get-Member(和Powershell)似乎有点困惑:

PS C:\> $a, $b | Get-Member


   TypeName: 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()             
p           NoteProperty int p=1                       
q           NoteProperty int q=2                       

PS C:\> $a, $b

p q
- -
1 2

PS C:\> $a, $b | Select-Object -Property p, q, r, s

p q r s
- - - -
1 2
    3 4

我的猜测是Get-Member遍历每种类型,只输出每种类型一次。例如,1, (Get-Date), 2 | gm仅输出System.Int32的一个实例。

比较最后两行的输出:

[int32]$c = 1;
[int32]$d = 2;

$d | Add-Member -MemberType NoteProperty -Name 'Test' -Value $true -Force;

$c, $d | Get-Member -MemberType NoteProperty;

$d, $c | Get-Member -MemberType NoteProperty;