Как использовать Powershell Where-Object как оператор IN - PullRequest
17 голосов
/ 24 августа 2011

У меня есть следующий код, который работает:

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
}

Есть ли более чистый способ сделать это?

Что-то вроде:

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

Ответы [ 3 ]

23 голосов
/ 24 августа 2011

Используйте оператор -contains.Например:

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

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

Используйте help about_Comparison_Operators, чтобы узнать больше об этом и других операторах сравнения.

Обновление:

PowerShell v3 добавил-in оператор.Пример в оригинальном вопросе будет работать в v3.

10 голосов
/ 25 августа 2011

Вы можете использовать регулярное выражение:

$svr.Databases | where { $_.name -match 'testDB|master|model|msdb' } | foreach { $db.name }
1 голос
/ 27 февраля 2019

вы можете сделать это (по крайней мере, в PSv5):

$srv.Databases | where Name -in "testDB","master","model","msdb" | write-output { $_.Name }
...