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
}