You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 08:57:20