我试图想出一种将过滤器合并到自定义功能中的方法,但我还没有能够让它工作:
Function Test-Me{
Param
(
$Filter = "Number -like ""Three"""
)
$Obj = New-Object PSObject -Properties &{
Number = "One","Two","Three"
}
If($Filter){
$Obj | Where-Object $Filter
}else{
$Obj
}
}
我尝试了各种方法,但都失败了:
$Filter = 'Where-Object{$_' + $Filter + '}'
$Obj | & $Filter
$Filter = "Number -like ""One"""
$Obj | Where & $Filter
如何将Filter
支持纳入自定义函数?
答案 0 :(得分:2)
将参数类型设置为ScriptBlock
:
Function Test-Me {
Param(
[ScriptBlock]$Filter = {$_.Number -like 'Three'}
)
$Obj = 'One','Two','Three' | % {[PSCustomObject]@{Number = $_}}
$Obj | Where-Object $Filter
}
并将过滤器定义为实际的脚本块:
PS C:\> Function Test-Me {
>> Param([ScriptBlock]$Filter = {$_.Number -like 'Three'})
>> $Obj = 'One','Two','Three' | % {[PSCustomObject]@{Number = $_}}
>> $Obj | Where-Object $Filter
>> }
>>
PS C:\> Test-Me
Number
------
Three
PS C:\> $sb = { $_.Number -like 't*' }
PS C:\> Test-Me $sb
Number
------
Two
Three
PS C:\> Test-Me {$_.Number -like '*e'}
Number
------
One
Three
如果您的函数由于某种原因必须接受字符串输入,则可以create scriptblocks从字符串开始,如@Richard所示:
Function Test-Me {
Param(
[string]$Filter = '$_.Number -like "Three"'
)
$fltr = [ScriptBlock]::Create($Filter)
$Obj = 'One','Two','Three' | % {[PSCustomObject]@{Number = $_}}
$Obj | Where-Object $fltr
}
答案 1 :(得分:1)
您不能只传递一个字符串并期望它作为cmdlet的参数进行扩展:PowerShell的解析比这更复杂。
但您应该能够将字符串转换为脚本块(例如,see here)。然后将脚本块传递给Where-Object
的{{1}}参数。