Function 如何在PowerShell中实现筛选器?
我正在试图找到一种将过滤器合并到自定义函数中的方法,但一直无法使其正常工作:Function 如何在PowerShell中实现筛选器?,function,powershell,filter,Function,Powershell,Filter,我正在试图找到一种将过滤器合并到自定义函数中的方法,但一直无法使其正常工作: Function Test-Me{ Param ( $Filter = "Number -like ""Three""" ) $Obj = New-Object PSObject -Properties &{ Number = "One","Two","Three"
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
如何将筛选器支持合并到自定义函数中?您不能只传递一个字符串,然后期望它作为cmdlet的参数进行扩展:PowerShell的解析比这更复杂 但您应该能够将字符串转换为脚本块,例如。然后将脚本块传递给Where对象的-FilterScript参数。将参数类型设置为ScriptBlock: 并将过滤器定义为实际脚本块: PS C:\>功能测试Me{ >>Param[ScriptBlock]$Filter={$\.Number-类似于'Three'} >>$Obj='1'、'2'、'3'|%{[PSCustomObject]@{Number=$} >>$Obj |其中对象$Filter >> } >> PS C:\>测试我 数字 --- 三 PS C:\>$sb={$\.Number-类似于't*'} PS C:\>测试我$sb 数字 --- 二 三 PS C:\>测试Me{$\.Number-like'*e'} 数字 --- 一 三 如果您的函数出于某种原因必须接受字符串输入,您可以按照建议从字符串中选择:
Function Test-Me {
Param(
[string]$Filter = '$_.Number -like "Three"'
)
$fltr = [ScriptBlock]::Create($Filter)
$Obj = 'One','Two','Three' | % {[PSCustomObject]@{Number = $_}}
$Obj | Where-Object $fltr
}
实际上,您不必在筛选器中包含$。但这是最接近真实答案的,所以我接受你的。@Colyn1337简化语法只适用于简单表达式,并且仅适用于PowerShell v3及更新版本。例如,如果要将2个或多个条件与逻辑运算符$\类似于't*'或$\类似于'*e'的.Number组合,则必须使用$\。
Function Test-Me {
Param(
[ScriptBlock]$Filter = {$_.Number -like 'Three'}
)
$Obj = 'One','Two','Three' | % {[PSCustomObject]@{Number = $_}}
$Obj | Where-Object $Filter
}
Function Test-Me {
Param(
[string]$Filter = '$_.Number -like "Three"'
)
$fltr = [ScriptBlock]::Create($Filter)
$Obj = 'One','Two','Three' | % {[PSCustomObject]@{Number = $_}}
$Obj | Where-Object $fltr
}