跨链接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
关键修改说明
- 修正vCenter地址拼写:原代码中
$vc2 = 'vccs2.company.com'是笔误,改为vcsa2.company.com确保连接正确。 - 端口组处理逻辑:
- 先从源vCenter获取虚拟机的端口组名称,再到目标vCenter上查询同名的端口组对象。跨vCenter迁移时,不能直接使用源vCenter的端口组对象,必须在目标vCenter上获取对应对象。
- 彻底移除了原代码中把命令字符串赋值给
$destinationPortGroup的错误写法,直接获取符合类型要求的对象。
- 存储与集群参数修正:
- 把
destinationDatastore从错误的pure_vm_prod改为配置中实际的company_storage,并且获取存储对象而非字符串名称(传对象比传字符串更可靠)。 - 原代码中
$destinationCluster只获取了名称,改为直接获取集群对象,符合Move-VM的-Destination参数要求。
- 把
- 明确指定Server参数:所有
Get-*命令都加上-Server参数,避免在多vCenter连接时出现对象混淆。
额外注意事项
- 如果虚拟机有多个网卡,需要循环处理每个端口组,确保所有网卡都映射到目标vCenter的对应端口组。
- 端口组名称中的竖线
|不需要额外转义,PowerShell在通过Get-VirtualPortGroup -Name查询时可以直接识别。
内容的提问来源于stack exchange,提问作者bfowler
相关产品推荐
相关产品推荐

