PowerShell Where-Object如何匹配多个字符串值

11
我在 do-until 块里使用以下代码进行循环,直到指定的 Exchange Online 迁移状态出现:
(Get-Migrationbatch -Identity $MigrationBatchName | Where {$_.Status -like "Completed" -or "CompletedWithErrors" -or "Corrupted" -or "Failed" -or "Stopped"})

然而,上述代码仍会返回一个状态为“同步中”的作业,因此脚本会继续执行。

我尝试了-match和-eq但结果仍然相同。

我错过了什么?


你能发布一下 Get-Migrationbatch -Identity $MigrationBatchName 返回的结果吗?你使用了错误的 or,这可能是你遇到问题的原因。同时,只使用 Where {$_.Status -like "Completed"} 这个条件是否可以正常工作? - ShanayL
“Get-Migrationbatch -Identity $MigrationBatchName”返回了存储在变量中的作业,但状态为“正在同步”。仅使用“Where {$_ .Status -like“ Completed”}”可以工作,但我以前认为已经正确地解决了这个问题。那么我该如何使用“-or”呢? - jshizzle
3个回答

30

你必须这样写:

(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 })

1
你比我先一步了。 - ShanayL
1
啊,太好了,谢谢。我已经尝试过这种方法了,但是使用的是-eq而不是-like...哎呀!我也开始尝试使用数组了,但是又忘记使用-contains开关而不是-like。我刚刚尝试了上面的数组方法,但是完全没有得到任何结果! - jshizzle
你正在使用哪个版本的PowerShell? - JamesQMurphy
PSVersion 5.0.10586.117 - jshizzle
奇怪,我测试了第二个脚本的模拟版本...如果数组方法对您不起作用,请提出另一个问题,我们会看一下 :) - JamesQMurphy
显示剩余4条评论

17

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

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

2
如此简单而美丽。 - Oz Edri
很好地利用了这个解决方法,而不是使用多个 -or -and 条件。 - Almighty

4
另一种选项是将过滤器数组转换为正则表达式字符串...
$filter_status = @("Completed", "CompletedWithErrors","Curropted","Failed", "Stopped")
(Get-Migrationbatch -Identity $MigrationBatchName | Where Status -Match ($filter_status -Join "|")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接