PowerShell脚本Do循环PercentComplete为100%时无法停止问题排查
问题根因
两处问题的核心诱因如下:
- 循环无限执行:
Until后的判断逻辑存在两个错误:一是把大括号包裹的脚本块直接和整数100做相等比较,PowerShell不会自动执行脚本块取值再对比,判断结果永远为$false;二是即使去掉脚本块大括号,Select-Object PercentComplete返回的是包含PercentComplete属性的自定义对象,不是整数数值,和100对比永远不成立,因此循环永远无法触发终止条件。另外原代码中-InformationVariable $Mailbox的写法有误,该参数需要传入不带$的变量名,否则无法正常赋值。 - 重复输出表头:每次循环都单独调用
Format-Table,该cmdlet默认每次执行都会输出完整的表头、分隔线和当前传入的对象,自然无法实现逐行追加进度的效果。
修复后可直接运行的脚本
Import-Module ExchangeOnlineManagement Connect-ExchangeOnline $User = "thomas.smith@mailbox.com" $cred = Get-Credential New-MoveRequest -Identity $User -Remote -RemoteHostName "remotemailboxaddress" -TargetDeliveryDomain "targetdomain.mail.onmicrosoft.com" -RemoteCredential $cred # 首次输出仅打印表头和分隔线 Get-MoveRequestStatistics -Identity $User | Select-Object Displayname, StatusDetail, TotalMailboxSize, PercentComplete | Format-Table -AutoSize | Select-Object -First 2 | Out-Host do { Start-Sleep -Seconds 3 # 拉取最新迁移状态存入变量,避免重复调用接口 $stats = Get-MoveRequestStatistics -Identity $User # 隐藏表头仅输出当前进度行 $stats | Select-Object Displayname, StatusDetail, TotalMailboxSize, PercentComplete | Format-Table -AutoSize -HideTableHeaders | Out-Host # 直接读取属性的整数值做判断,数值匹配时终止循环 } until ($stats.PercentComplete -eq 100) # 迁移完成后跳过确认直接断开连接 Disconnect-ExchangeOnline -Confirm:$false
关键修改点说明
- 每次循环仅调用一次迁移状态查询接口,结果存入
$stats变量复用,减少不必要的API请求 - 循环启动前单独输出一次表头,循环内通过
-HideTableHeaders参数隐藏表头,仅输出当前进度数据,实现逐行追加记录的效果 - 移除
Until判断处无意义的脚本块包裹,直接读取$stats.PercentComplete的整数值和100做对比,条件成立时立刻终止循环 - 给
Disconnect-ExchangeOnline添加-Confirm:$false参数,避免弹出确认框阻断脚本自动执行 - 提前将凭据存入变量,避免循环执行过程中意外触发凭据输入弹窗
如果迁移过程中存在偶发的接口查询失败场景,可以在循环内添加简单的错误捕获逻辑,避免脚本意外退出。
内容的提问来源于stack exchange,提问作者CrowbarTM
相关产品推荐
相关产品推荐

