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

跨链接vCenter的PowerCLI vMotion迁移故障排查

问题解决:PowerCLI跨vCenter vMotion类型转换错误

核心问题

你遇到的错误是因为Move-VM的-PortGroup参数要求传入**VirtualPortGroupBase类型的对象**,但你传入的是字符串值(甚至是包含命令的文本字符串),类型不匹配导致转换失败。此外代码中还有几处拼写和逻辑问题需要修正。

修正后的完整代码

$vc1 = 'vcsa1.company.com'
# 修正拼写错误:vccs2 -> vcsa2
$vc2 = 'vcsa2.company.com'
$MyVm = 'test-vm'
$cred = Get-Credential

# 连接两台vCenter
Connect-VIServer $vc1 -Credential $cred
Connect-VIServer $vc2 -Credential $cred

# 获取源虚拟机对象(指定Server确保从vc1获取)
$vm = Get-VM -Name $MyVm -Server $vc1

# 获取源虚拟机的端口组名称
$sourcePgName = (Get-VirtualPortGroup -VM $vm).Name

# 在目标vCenter(vc2)上获取同名的端口组对象
$destinationPortGroup = Get-VirtualPortGroup -Name $sourcePgName -Server $vc2

# 获取目标集群对象(根据实际集群名称修改,示例为Linux集群)
$destinationCluster = Get-Cluster -Name "Linux" -Server $vc2

# 目标存储(使用配置中实际的存储名称)
$destinationDatastore = Get-Datastore -Name "company_storage" -Server $vc2

# 执行跨vCenter vMotion
Move-VM -VM $vm `
        -Destination $destinationCluster `
        -Datastore $destinationDatastore `
        -PortGroup $destinationPortGroup `
        -Server $vc2 `
        -Credential $cred

关键修改说明

  1. 修正vCenter地址拼写:原代码中$vc2 = 'vccs2.company.com'是笔误,改为vcsa2.company.com确保连接正确。
  2. 端口组处理逻辑:
    • 先从源vCenter获取虚拟机的端口组名称,再到目标vCenter上查询同名的端口组对象。跨vCenter迁移时,不能直接使用源vCenter的端口组对象,必须在目标vCenter上获取对应对象。
    • 彻底移除了原代码中把命令字符串赋值给$destinationPortGroup的错误写法,直接获取符合类型要求的对象。
  3. 存储与集群参数修正:
    • 把destinationDatastore从错误的pure_vm_prod改为配置中实际的company_storage,并且获取存储对象而非字符串名称(传对象比传字符串更可靠)。
    • 原代码中$destinationCluster只获取了名称,改为直接获取集群对象,符合Move-VM的-Destination参数要求。
  4. 明确指定Server参数:所有Get-*命令都加上-Server参数,避免在多vCenter连接时出现对象混淆。

额外注意事项

  • 如果虚拟机有多个网卡,需要循环处理每个端口组,确保所有网卡都映射到目标vCenter的对应端口组。
  • 端口组名称中的竖线|不需要额外转义,PowerShell在通过Get-VirtualPortGroup -Name查询时可以直接识别。

内容的提问来源于stack exchange,提问作者bfowler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:52:52