PowerShell Where-Object 喜欢多个字符串值

PowerShell Where-Object like multiple string values

我在 do-until 块中使用以下循环,直到出现指定的 Exchange Online 迁移状态:

(Get-Migrationbatch -Identity $MigrationBatchName | Where {$_.Status -like "Completed" -or "CompletedWithErrors" -or "Corrupted" -or "Failed" -or "Stopped"})

但是,以上仍然是 returns 状态为 "Syncing" 的作业,因此无论如何都会继续执行脚本。

我试过-match、-eq但还是一样。

我错过了什么?

你必须这样写:

(Get-Migrationbatch -Identity $MigrationBatchName | Where {($_.Status -like "Completed") -or ($_.Status -like "CompletedWithErrors") -or ($_.Status -like "Corrupted") -or ($_.Status -like "Failed") -or ($_.Status -like "Stopped")})

这是另一种方法:

$valuesToLookFor = @(
    'Completed',
    'CompletedWithErrors',
    'Corrupted',
    'Failed',
    'Stopped')

(Get-Migrationbatch -Identity $MigrationBatchName |
    Where-Object { $valuesToLookFor -contains $_.Status })

如果您不使用通配符,使用 -in 运算符会更简单:

(Get-Migrationbatch -Identity $MigrationBatchName | Where Status -in "Completed","CompletedWithErrors","Corrupted","Failed","Stopped")

另一个选项将过滤器数组转换为正则表达式字符串...

$filter_status = @("Completed", "CompletedWithErrors","Curropted","Failed", "Stopped")
(Get-Migrationbatch -Identity $MigrationBatchName | Where Status -Match ($filter_status -Join "|")