如何在PowerShell中实现过滤器?

时间:2015-08-04 14:53:16

标签: function powershell filter

我试图想出一种将过滤器合并到自定义功能中的方法,但我还没有能够让它工作:

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支持纳入自定义函数?

2 个答案:

答案 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}}参数。