PowerShell - FilterScript'i değişken olarak Where-Object'e geçir

Sep 11 2020

Bir değişkene Where-Object FilterScript komut dosyası bloğu yerleştirmeye çalışıyorum, ancak şimdiye kadar hiç şansım olmadı. Yapmaya çalıştığım şeyin basit bir örneği olarak:

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

Bu işe yaramıyor gibi görünüyor; Tüm unsurları geri alıyorum. Ben de denedim:

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

Bunların hepsi geri dönüyor:

one
two
three

Ancak değişkeni gerçek filtre ile değiştirmek beklendiği gibi çalışır:

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

Bu, "iki" ve "üç" olmadan yalnızca "bir" döndürür. Bunu nasıl çalıştıracağımı bilen var mı? Başlangıçta Core v7.0.3'te deniyordum, ancak Windows PowerShell v5.1'de de test ettim.

Yanıtlar

4 Garrett Sep 11 2020 at 15:41

Ardından küme parantezleri -FilterScriptsizi karıştırıyor, değişken bir ScriptBlock içerdiğinde artık bu parantezlere ihtiyacınız yok. Orada varsa, bu, bir komut bloğu içeren bir değişkenin komut bloğudur.

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

Eğer eklerseniz [scriptblock]sizin için $filterşiddetle değişkeni yazın değişken size değişken tanımlarken parantez eklemek kadar, bu biçimlendirme hakkında şikayet ediyor. Bu, beslediğiniz nesnenin parametresi Where-Objectiçin beklenen türle eşleşmesini sağlamanın harika bir yoludur.-FilterScriptScriptBlock

Küme parantezleri değişken tanımına girdikten sonra güçlü tür zorlanmadan çalışacaktır, bu da onun bir ScriptBlock olmasına neden olur, ancak türü orada bırakırdım, böylece motor biri parantezleri çıkarsa ve fark etmezse motor şikayet eder İşlem sırasında değişken türünüzü değiştiriyoruz.

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