PowerShell-将 FilterScript 作为变量传递给 Where-Object

PowerShell-将 FilterScript 作为变量传递给 Where-Object

我正在尝试将 Where-Object FilterScript 脚本块放入变量中,但到目前为止还没有成功。下面是我正在尝试做的一个简单示例:

$test = @('one','two','three')
$filter = '$_ -eq "one"'
$test | Where-Object -FilterScript { $filter }

这似乎不起作用;我恢复了所有元素。我也尝试过:

$filter = { $_ -eq "one" }
$filter = [scriptblock]::Create($_ -eq 'one')

这些都返回:

one
two
three

但是,用实际的过滤器替换变量可以按预期工作:

$test | Where-Object -FilterScript { $_ -eq "one" }

这只返回“one”,不返回“two”和“three”。有人知道我该如何实现它吗?我最初是在 Core v7.0.3 上尝试的,但也在 Windows PowerShell v5.1 上进行了测试。

答案1

后面的花括号-FilterScript会让您感到困惑,一旦变量包含 ScriptBlock,您就不再需要这些花括号了。如果您在那里有花括号,那么它就是包含脚本块的变量的脚本块。

$foo = "hi"
$foo | gm     (TypeName: String)
{$foo} | gm   (TypeName: ScriptBlock)

如果您[scriptblock]$filter变量添加强类型变量,它会抱怨格式,直到您在定义变量时添加括号。这是一种很好的方法,可以确保您输入的对象Where-Object与其参数的预期类型相匹配-FilterScript,即ScriptBlock

一旦括号位于变量定义中,它就可以在没有强制强类型的情况下工作,这会导致它成为一个 ScriptBlock,但我会将类型保留在那里,这样如果有人删除括号并且没有意识到他们正在更改你的变量类型,引擎就会抱怨。

$test = @('one','two','three')
[scriptblock]$filter = { $_ -eq "one" }
$test | Where-Object -FilterScript $filter
one

相关内容