PowerShell批量移除VMware孤立VM后无法正确重新注册问题求助
多孤立虚拟机自动重注册脚本故障修复
问题说明
开发vCenter环境孤立虚拟机自动移除重注册脚本时,单台孤立VM场景下逻辑可正常运行,当目标ESXi主机存在1台以上orphaned状态孤立虚拟机时,脚本无法正确留存每台虚拟机对应的名称与VMX路径映射关系,执行Remove-VM删除孤立清单条目后,无法匹配对应参数完成虚拟机重新注册。
原故障脚本
$vCenter = "vc" $vCUser = "user" $vCPW = "pass" Connect-VIServer $vCenter -User $vCUser -Password $vCPW -Force $ResourcePool = "hostname" $VMHost = Get-VMHost -Name $ResourcePool | Get-VM -Name * | ?{$_.ExtensionData.Runtime.ConnectionState -eq "orphaned"} | Select-Object Name, @{N = 'VMX'; E = { $_.ExtensionData.Summary.Config.VmPathName}} Remove-VM -VM $VMHost.Name -Confirm:$false New-VM -Name $VMHost.Name -ResourcePool $ResourcePool -VMFilePath $VMHost.VMX Disconnect-VIServer -Server $vCenter -Force -Confirm:$false
故障根因
- 批量获取多台孤立VM信息后,直接将对象数组的属性批量传递给删除、新建命令,未做单台遍历,多对象场景下会出现参数绑定错位,无法保证名称与VMX路径一一对应
- 未对查询到的VM信息做独立持久化校验,无空值判断逻辑,无单VM处理流程跟踪能力
修正后可运行脚本
$vCenter = "vc" $vCUser = "user" $vCPW = "pass" Connect-VIServer $vCenter -User $vCUser -Password $vCPW -Force $targetResourcePool = "hostname" # 执行删除操作前全量查询所有孤立VM,持久化存储名称与VMX路径的映射关系 $orphanedVMList = Get-VMHost -Name $targetResourcePool | Get-VM | Where-Object { $_.ExtensionData.Runtime.ConnectionState -eq "orphaned" } | Select-Object Name, @{ N = 'VMX' E = { $_.ExtensionData.Summary.Config.VmPathName } } # 无匹配孤立VM时直接退出 if (-not $orphanedVMList) { Write-Host "目标主机无orphaned状态孤立虚拟机,执行结束" Disconnect-VIServer -Server $vCenter -Force -Confirm:$false exit } # 逐台遍历处理,确保每台VM的名称与VMX路径一一匹配 foreach ($singleVM in $orphanedVMList) { Write-Host "正在处理虚拟机: $($singleVM.Name),对应VMX路径: $($singleVM.VMX)" # 移除vCenter清单中的孤立条目 Remove-VM -VM $singleVM.Name -Confirm:$false # 按对应VMX路径重新注册虚拟机 New-VM -Name $singleVM.Name -ResourcePool $targetResourcePool -VMFilePath $singleVM.VMX } Disconnect-VIServer -Server $vCenter -Force -Confirm:$false
核心调整点
- 所有孤立VM的属性查询操作放在删除操作之前完成,将结果存储为独立结构化数组,避免后续删除操作影响数据源准确性
- 新增空结果判断逻辑,避免无匹配VM时执行空命令报错
- 替换批量传参逻辑为
foreach单台循环处理,每台VM的删除、注册操作都读取当前循环条目的专属属性,彻底解决多VM场景下参数错位问题 - 新增执行日志输出,可实时跟踪每台VM的处理进度
内容的提问来源于stack exchange,提问作者Vlad Belo
相关产品推荐
相关产品推荐

