I received this in email today:
“I have XCOPY’d a bunch of VHDX files from one volume to another on WS2016. What’s the easiest / fastest way to fix up the paths for the VM’s???”
The answer to this is quite simple. Open PowerShell and run:
$oldPath = "C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks"
$newPath = "D:"
get-vm | Get-VMHardDiskDrive | ? path -Like $oldPath* | %{Set-VMHardDiskDrive -VMHardDiskDrive $_ -Path $_.path.Replace($oldPath, $newPath)}
A couple of details on this answer:
- PowerShell is wonderful for these kinds of bulk operations
- While we do not allow you to edit the virtual hard disk path on a saved virtual machine using Hyper-V manager – we do allow you to do this through PowerShell. In fact – there are a lot of things that are blocked in Hyper-V manager that are possible through PowerShell.
Cheers,
Ben
And if you are a noob to PowerShell (we all were once):
The ‘%’ is a shorthand alias of ForEach-Object as is “foreach”
And the $_ refers to the object being passed in to the script block between the brackets.
Which in the example above is the VMHardDiskDrive path parameter.
Get- returns the entire VMHardDiskDrive object and the -like selects the parameter that matches the name pattern “$path*” and this value is piped to the script block and referenced using the $_
Thanks for the clarifications! 🙂
This won’t work when you have VMReplication enabled on the VM(s)…
Is there some way through Powershell to workaround that aswell, I hope ?
Need to do this on a couple of huge VMs, and removing and re-seeding the Replica would a huge pain…
Have you tried VM Storage Migration ? It should work while VM Replication is enabled.