PowerShell - Passez FilterScript à Where-Object en tant que variable
J'essaye d'obtenir un scriptblock Where-Object FilterScript dans une variable, mais je n'ai pas eu de chance pour le moment. À titre d'exemple simple de ce que j'essaie de faire:
$test = @('one','two','three') $filter = '$_ -eq "one"' $test | Where-Object -FilterScript { $filter }
Cela ne semble pas fonctionner; Je récupère tous les éléments. J'ai aussi essayé:
$filter = { $_ -eq "one" } $filter = [scriptblock]::Create($_ -eq 'one')
Ceux-ci reviennent tous:
one
two
three
Cependant, le remplacement de la variable par le filtre réel fonctionne comme prévu:
$test | Where-Object -FilterScript { $_ -eq "one" }
Cela renvoie seulement «un», sans «deux» et «trois». Quelqu'un sait-il comment je peux faire en sorte que cela fonctionne? Je l'essayais à l'origine sur Core v7.0.3, mais je l'ai également testé sur Windows PowerShell v5.1.
Réponses
Les accolades après -FilterScriptvous dérangent, une fois que la variable contient un ScriptBlock, vous n'avez plus besoin de ces accolades. Si vous les avez là, c'est un scriptblock d'une variable contenant un scriptblock.
$foo = "hi" $foo | gm (TypeName: String)
{$foo} | gm (TypeName: ScriptBlock)
Si vous ajoutez [scriptblock]à votre $filtervariable pour taper fortement la variable, il se plaint de la mise en forme jusqu'à ce que vous ajoutiez les accolades lorsque vous définissez votre variable. C'est un excellent moyen de garantir que l'objet que vous alimentez Where-Objectcorrespond au type attendu pour son -FilterScriptparamètre qui estScriptBlock
Cela fonctionnera sans que le type fort soit forcé une fois que les accolades sont dans la définition de variable, ce qui le fait devenir un ScriptBlock, mais je laisserais le type là-dedans pour que le moteur se plaint si quelqu'un supprime les accolades et ne se rend pas compte qu'ils changez votre type de variable dans le processus.
$test = @('one','two','three') [scriptblock]$filter = { $_ -eq "one" } $test | Where-Object -FilterScript $filter
one