Move VMs from an old SAN to an new using powerCLI part 2
Hi
I was informed that my script in the last post was not enough because @pfuhli has a bit more complex environment and then the Move-VM cmdlet is not sufficient because it moves the whole vm to the new datastore, no matter if the vmdk´s where located on different before.
As in some cases you have an virtual platform with different datastores for different performance levels and one VM has it´s vmdk configured to get the best throughput. So i did this with help from a script that Luc Dekens did in a communities post, mine added some functionality as his only moved the config file.
please comment if you find something crazy, I have now started to get the hang of why I would use functions
, yes i should add some error-checking, that will be in version 0.3
Probably it would take some time to get through 500 VM´s but instead of manual work it is worth it.
# Move VMs with sVMotion where vmdk is on different datastores and
# lastly move the config file to the same datastore as hard disk 1
#
# Niklas Åkerlund / RTS 20111127
# Part of code from Luc Dekens http://communities.vmware.com/message/1680735
# Here i extended Luc´s function for moving only config
function Move-VMs{
param($vm)
Write-Host $vm
$HDDs = Get-HardDisk -VM $vm
# a foreach loop to move vmdk
$HDDs | %{
# Get the datastore name of the old
$oldDS = $_.Filename.Split(']')[0].TrimStart('[')
# as @pfuhli said the new lun has a preceding letter that differs from the old.
$newDS = "N" + $oldDS
# Here i check which is the first hdd to later move the config there
if ($_.Name -eq "Hard disk 1"){
$dsNameHDD1 = $newDS
}
$newDS = Get-Datastore $newDS
Set-HardDisk -HardDisk $_ -Datastore $newDS -Confirm:$false
}
# This part is for moving the config file
$HDDs = Get-HardDisk -VM $vm
$spec = New-Object VMware.Vim.VirtualMachineRelocateSpec
$spec.datastore = (Get-Datastore -Name $dsNameHDD1).Extensiondata.MoRef
$HDDs | %{
$disk = New-Object VMware.Vim.VirtualMachineRelocateSpecDiskLocator
$disk.diskId = $_.Extensiondata.Key
$disk.datastore = $_.Extensiondata.Backing.Datastore
$spec.disk += $disk
}
$vm.Extensiondata.RelocateVM_Task($spec, "defaultPriority")
}
Get-VM | %{
Move-VMs $_
}
Before running it on all VM´s i would test it on a few and then when feeling comfortable, you can move all







