2011-08-24 24 views
14

Mam następujący kod, który działa:Jak używać PowerShell Where-Object jak oświadczenie, w

foreach ($db in $svr.Databases | 
     where-object { 
     $_.name -eq "testDB" 
     -or $_.name -eq "master" 
     -or $_.name -eq "model" 
     -or $_.name -eq "msdb" }) 
{ 
    write-output $db.name 
} 

Jest przejrzysty sposób to zrobić?

Coś jak:

foreach ($db in $svr.Databases | 
     where-object {$_.name -in "testDB, master, model, msdb" })  
{ 
    write-output $db.name 
} 

Odpowiedz

19

użyć operatora -contains. Jak:

$dbs = "testDB", "master", "model", "msdb" 

foreach ($db in ($svr.Databases | where-object {$dbs -contains $_.name })) { 
    write-output $db.name 
} 

Zastosowanie help about_Comparison_Operators, aby dowiedzieć się więcej o tym i innych operatorów porównania.

Update:

PowerShell V3 dodano operatora -in. Przykład z pierwotnego pytania będzie działał w wersji 3.

+0

Czy nie brakuje paren tam? – Hill

+0

Tak, tęskniłem za parenem. Dzięki, naprawione. – Rynant

+0

Przykład oryginalnego pytania nie będzie działał - ponieważ jest to ciąg rozdzielany przecinkami - a nie tablica. –

7

Można użyć wyrażenia regularnego:

$svr.Databases | where { $_.name -match 'testDB|master|model|msdb' } | foreach { $db.name }