管道对象集合时,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
答案 0 :(得分:0)
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;