获取成员停止PowerShell管道
管道化对象集合时,获取成员停止PowerShell管道,powershell,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
和%{$|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
当数组中相同类型的对象没有匹配的属性时,Get成员(和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;
当数组中相同类型的对象没有匹配的属性时,Get成员(和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;
获取成员
仅获取相同类型名称的第一个对象的成员
@PetSerAl感谢您的快速回复Get Member
似乎像你说的那样工作。我不知道它为什么会这样,我只能猜测。我认为,它针对一般用例进行了优化,如ps | gm
或dir | gm
。是否应ps | gm
制作有关系统.诊断.过程
的信息副本?通常,具有相同TypeName
的对象具有相同的成员,因此Get Member
仅为每个TypeName
打印一次此信息Get Member
仅为相同TypeName
的第一个对象获取成员@PetSerAl感谢您的快速回复Get Member
似乎像你说的那样工作。我不知道它为什么会这样,我只能猜测。我认为,它针对一般用例进行了优化,如ps | gm
或dir | gm
。是否应ps | gm
制作有关系统.诊断.过程
的信息副本?通常情况下,具有相同TypeName
的对象具有相同的成员,因此Get Member
只为每个TypeName
打印一次此信息$a、 1 |获取成员,$a.PSTypeNames.Insert(0,'System.Int32')$a、 1 |获得会员
@Bacon Bits@PetSerAl感谢您的回复!我了解Get Member
的行为。但是我仍然不知道这个行为什么时候有用$a、 1 |获取成员,$a.PSTypeNames.Insert(0,'System.Int32')$a、 1 |获得会员
@Bacon Bits@PetSerAl感谢您的回复!我了解Get Member
的行为。但我仍然不知道这种行为何时有用。