2011-08-24 8 views
14

ho il seguente codice che funziona:Come utilizzare PowerShell Where-Object come una dichiarazione IN

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 
} 

è un modo pulito di fare questo?

Qualcosa di simile:

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

risposta

19

Utilizzare l'operatore -contains. Come:

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

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

Usa help about_Comparison_Operators per saperne di più su questo e altri operatori di confronto.

Aggiornamento:

PowerShell v3 ha aggiunto l'operatore -in. L'esempio nella domanda originale funzionerà nella v3.

+0

Vi manca una parentesi lì? – Hill

+0

Sì, mi è mancato un paren. Grazie, risolto. – Rynant

+0

L'esempio nella domanda originale non funzionerà del tutto - in quanto è una stringa delimitata da una virgola - non una matrice. –

7

È possibile utilizzare un espressione regolare: non

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