PowerShell-FilterScript를 Where-Object에 변수로 전달

Sep 11 2020

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" }

이것은 "two"와 "three"없이 "one"만 반환합니다. 이 일을 어떻게 할 수 있는지 아는 사람이 있습니까? 원래 Core v7.0.3에서 시도했지만 Windows PowerShell v5.1에서도 테스트했습니다.

답변

4 Garrett Sep 11 2020 at 15:41

중괄호 후 -FilterScript변수가 스크립트 블록을 포함하면 당신은 더 이상 그 괄호가 필요하지 않습니다, 당신을 엉망으로하고 있습니다. 거기에 있다면 스크립트 블록을 포함하는 변수의 스크립트 블록입니다.

$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