Estou tentando colocar um bloco de script Where-Object FilterScript em uma variável, mas não tive sorte até agora. Como um exemplo simples do que estou tentando fazer:
$test = @('one','two','three')
$filter = '$_ -eq "one"'
$test | Where-Object -FilterScript { $filter }
Isso não parece funcionar; Eu recupero todos os elementos. Eu também tentei:
$filter = { $_ -eq "one" }
$filter = [scriptblock]::Create($_ -eq 'one')
Todos estes retornam:
one
two
three
No entanto, substituir a variável pelo filtro real funciona conforme o esperado:
$test | Where-Object -FilterScript { $_ -eq "one" }
Isso retorna apenas "um", sem "dois" e "três". Alguém sabe como posso fazer isso funcionar? Eu estava tentando originalmente no Core v7.0.3, mas também testei no Windows PowerShell v5.1.
As chaves depois
-FilterScript
estão atrapalhando você, uma vez que a variável contém um ScriptBlock você não precisa mais dessas chaves. Se você os tiver lá, é um scriptblock de uma variável contendo um scriptblock.Se você adicionar
[scriptblock]
à sua$filter
variável para digitar fortemente a variável, ela reclamará da formatação até que você adicione as chaves ao definir sua variável. Essa é uma ótima maneira de garantir que o objeto que você está alimentandoWhere-Object
corresponda ao tipo esperado para seu-FilterScript
parâmetro, que éScriptBlock
Ele funcionará sem que o tipo forte seja forçado uma vez que as chaves estejam na definição da variável, o que faz com que ele se torne um ScriptBlock, mas eu deixaria o tipo lá para que o mecanismo reclame se alguém remover as chaves e não perceber que elas está mudando seu tipo de variável no processo.