I wrote this little script snippet to export and import virtual machines from one vCenter to another. This might help for migrations where you have to add virtual machines from a datastore manually to the vCenter inventory. This script does not export any virtual machine disks or configuration files. It's only supposed as replacement for adding virtual machines from an existing datastore the the inventory.

Export VMs

The script is cluster-based. Use the script multiple times if you have more than one cluster. You have to replace "MyCluster" with your clusters name. The Script will export information about all VMs to the $inventory array, and additionally to a csv file. You can always use the csv file load your inventory back to the $inventory array. The script exports:

VM-Name

VMX Path

Resource Pool

VM Folder

$cluster = Get-Cluster MyCluster $inventory = Get-Cluster $cluster | Get-VM | Add-Member -MemberType ScriptProperty -Name 'VMXPath' -Value {$this.extensiondata.config.files.vmpathname} -Passthru -Force | Select-Object Name,ResourcePool,Folder,VMXPath $inventory |Export-Csv inventory.csv

Import VMs

To add virtual machines back to the inventory, connect to the vCenter server where you want to add the VMs. You have to create the cluster and any resource pools or VM-Folders prior to use the script. The structure has to be identical to the vCenter where the VMs have been exported from. You also have to mount the original datastores.

(optional) Load the csv file back to the $inventory array:

$inventory = Import-Csv inventory.csv

Add VMs back to the inventory:

$cluster = Get-Cluster MyCluster foreach($vm in $inventory){ $ESXHost = Get-Cluster $cluster | Get-VMHost | select -First 1 New-VM -VMFilePath $vm.VMXPath -VMHost $ESXHost -Location $vm.Folder -ResourcePool (Get-Cluster $cluster | Get-ResourcePool $vm.ResourcePool) }