首页 > 解决方案 > 添加 ScriptMethod Helper 以查询 PSCustomObject

问题描述

我正在尝试向现有的 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])"})}


标签: powershell

解决方案


$Args 每个范围都有一个,因此$Args里面.Where{ <in here> }实际上并不包含脚本方法的输入参数 - 而是声明一个命名参数,它会起作用:

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

推荐阅读