Powershell 添加ScriptMethod帮助器以查询PSCustomObject

Powershell 添加ScriptMethod帮助器以查询PSCustomObject,powershell,Powershell,我正在尝试向现有PSCustomObject添加一些简单的帮助器方法。 我的目标是替换如下内容: $Persons.Where{$_.FirstName -like "*Test*"} 为此: $Persons.GetFirstName("Test") 我很难找到一个可以与add member一起使用的ScriptMethod。 下面是我的示例代码,以及我迄今为止尝试过的所有变体: $Persons = [PSCustomObject]@() $Pe

我正在尝试向现有PSCustomObject添加一些简单的帮助器方法。 我的目标是替换如下内容:

$Persons.Where{$_.FirstName -like "*Test*"}
为此:

$Persons.GetFirstName("Test")
我很难找到一个可以与add member一起使用的ScriptMethod。
下面是我的示例代码,以及我迄今为止尝试过的所有变体:

$Persons = [PSCustomObject]@()

$Person1 = [PSCustomObject]@{
    FirstName = 'John';
    LastName = 'Doe';
    Age = 27
    }
$Person2 = [PSCustomObject]@{
    FirstName = 'Test';
    LastName = 'Dummy';
    Age = 27
    }

$Persons += $Person1 
$Persons += $Person2 

$Persons
#FirstName LastName Age
#--------- -------- ---
#John      Doe       27
#Test      Dummy     27

#Get using a regular where method to confirm
$Persons.Where{$_.FirstName -like "*Test*"}
#FirstName LastName Age
#--------- -------- ---
#Test      Dummy     27

#Add the Helper Method GetFirstName
add-member -inputobject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {$this.where{$_.FirstName -like "$Args[0]"}}

#Check if the Test record is returned
$Persons.GetFullName("Test")

#Use this to remove the method for the next try
$Persons.PSObject.properties.remove('GetFirstName')

#Other Permutations I have tried
add-member -inputobject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {$this.where($this.FirstName -like "$($Args[0])")}
add-member -inputobject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {$this.where({FirstName -like $Args[0]})}
add-member -inputobject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {$this.where({FirstName -like $args(0)})}
add-member -inputobject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {$this.where({FirstName -like "$Args[0]"})}
add-member -inputobject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {$this.where({FirstName -like "$($Args[0])"})}
add-member -inputobject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {$this.where({$this.FirstName -like $Args[0]})}
add-member -inputobject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {$this.where({$this.FirstName -like "*$($Args[0])*"})}
add-member -inputobject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {$this.where({$this.FirstName -eq $Args[0]})}
add-member -inputobject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {$this.where({$_.FirstName -like $Args[0]})}
add-member -inputobject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {$this.where({$_.FirstName -like "$($Args[0])"})}
add-member -inputobject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {$this.where("FirstName -like ""$($Args[0])""")}
add-member -inputobject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {$this.where("$($_.FirstName) -like ""$($Args[0])""")}
add-member -inputobject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {$this.GetEnumerator().where{FirstName -like $Args[0]}}
add-member -inputobject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {$this.GetEnumerator().where{$this.FirstName -like $Args[0]}}
add-member -inputobject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {$this.GetEnumerator().where{$_.FirstName -like $Args[0]}}
add-member -inputobject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {$this | ?{$_.FirstName -like $Args[0]}}
add-member -inputobject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {$this | ?({$_.FirstName -like $Args[0]})}
add-member -inputobject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {$this | ?({$_.FirstName -like "$($Args[0])"})}



每个作用域都有一个
$Args
,因此
中的
$Args
实际上不包含脚本方法的输入参数,因此{}
声明一个命名参数即可:

Add-Member -InputObject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {
  param([string]$fnArg)
  
  $this.Where{$_.FirstName -like $fnArg}
} -Force

每个作用域都有一个
$Args
,因此
中的
$Args
实际上不包含脚本方法的输入参数,因此{}
声明一个命名参数即可:

Add-Member -InputObject $Persons -MemberType ScriptMethod -Name GetFirstName -Value {
  param([string]$fnArg)
  
  $this.Where{$_.FirstName -like $fnArg}
} -Force

你真棒!以下是我使用的(我引用了param以防万一):
addmember-inputobject$Persons-MemberType ScriptMethod-Name GetFirstName-Value{param([string]$fnArg);$this.where({$\uu.FirstName-Like“$fnArg”})
FWIW
在这里,
$fnArg
是双重不必要的:-)即使输入包含空格?在输入中防止空格只在解析输入时才有意义-另一方面,在这种情况下,它没有任何区别。“doubly”的意思是:
$fnArg
保证是字符串(多亏了父作用域中的
[string]
约束),而
-like
总是将字符串作为其左侧操作数,因此即使
$fnArg
的值不是字符串,它会自动转换为1:-)谢谢你的解释。实际上,我刚刚添加了一个名称中带有空格的记录,并创建了该方法的两个版本,带和不带,您完全正确;这些名言没什么区别,你太棒了!以下是我使用的(我引用了param以防万一):
addmember-inputobject$Persons-MemberType ScriptMethod-Name GetFirstName-Value{param([string]$fnArg);$this.where({$\uu.FirstName-Like“$fnArg”})
FWIW
在这里,
$fnArg
是双重不必要的:-)即使输入包含空格?在输入中防止空格只在解析输入时才有意义-另一方面,在这种情况下,它没有任何区别。“doubly”的意思是:
$fnArg
保证是字符串(多亏了父作用域中的
[string]
约束),而
-like
总是将字符串作为其左侧操作数,因此即使
$fnArg
的值不是字符串,它会自动转换为1:-)谢谢你的解释。实际上,我刚刚添加了一个名称中带有空格的记录,并创建了该方法的两个版本,带和不带,您完全正确;引用没有什么区别。