我正在尝试将 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" }
这仅返回“一”,没有“二”和“三”。有谁知道我怎样才能使这项工作?我最初是在 Core v7.0.3 上尝试它,但也在 Windows PowerShell v5.1 上进行了测试。
后面的花括号
-FilterScript
把你弄乱了,一旦变量包含一个 ScriptBlock 你就不再需要这些花括号了。如果你有它们,它是一个包含脚本块的变量的脚本块。如果您添加
[scriptblock]
到$filter
变量以强类型化变量,它会抱怨格式化,直到您在定义变量时添加大括号。这是确保您提供的对象与其参数Where-Object
的预期类型相匹配的好方法,即-FilterScript
ScriptBlock
一旦大括号在变量定义中,它就可以在不强制使用强类型的情况下工作,这会导致它成为一个 ScriptBlock,但我会将类型留在其中,因此如果有人删除了大括号并且没有意识到它们,引擎会抱怨'在这个过程中改变你的变量类型。