循环获取邮箱 cmdlet,直到没有错误返回

Loop get-mailbox cmdlet until no error returned

我有混合设置,共享邮箱在本地创建并在几分钟内同步到 Exchange Online。 我的套路是在本地创建一个共享邮箱,然后通过Connect-ExchangeOnline对其进行转换、填充、启用messagecopy等。

我想要一个小脚本来检查它是否同步到 EO。 我尝试了几种不同的方法,看起来这个方法应该有效,但不幸的是,它在成功或错误后中断,而没有像我期望的那样在 10 秒内尝试 运行 get-mailbox。 请评论和指教。

$ErrorActionPreference = 'SilentlyContinue'
$ID = "xxx@yyy"

$i=0
while ($i -le 10) {
    try {
        Get-Mailbox $ID 
        break
        }
    catch { 
        $i++
        $i
        Start-Sleep 10
        }
}

如评论所述,要同时捕获 non-terminating 个异常,您必须使用 -ErrorAction Stop

但为什么不简单地做一些像

$ID = "xxx@yyy"

for ($i = 0; $i -le 10; $i++) {  #  # loop 11 attempts maximum
    $mbx = Get-Mailbox -Identity $ID -ErrorAction SilentlyContinue
    if ($mbx) {
        Write-Host "Mailbox for '$ID' is found" -ForegroundColor Green
        break
    }
    Write-Host "Mailbox for '$ID' not found.. Waiting 10 more seconds"
    Start-Sleep -Seconds 10
}

或者,如果您想使用 try{..} catch{..}

$ID = "xxx@yyy"

for ($i = 0; $i -le 10; $i++) {  # loop 11 attempts maximum
    try {
        $mbx = Get-Mailbox -Identity $ID -ErrorAction Stop
        Write-Host "Mailbox for '$ID' is found" -ForegroundColor Green
        $i = 999  # exit the loop by setting the counter to a high value
    }
    catch {
        Write-Host "Mailbox for '$ID' not found.. Waiting 10 more seconds"
        Start-Sleep -Seconds 10
    }
}