Windows 8 Client Hyper-V and exchanging files with PowerShell
Ben the Virtual PC Guy did a blog post a while ago where he showed how to get files out of a running machine, and I made a follow up where using a non Hyper-V host to get the files.
Today I read on a forum that they where discussing how to get a folder and the files from a virtual machine running on Windows 8 client Hyper-V by enabling and fiddeling with the network. In some cases you do not want to enable networking on that guest to the Win8 host and then you can use the way that Ben showed.
Or you can use an VHD that you first connect to the Win8 host and then copy the files and when you are done you can disconnect it from the host machine and connect it to the virtual machine, with this approach instead of the snapshot you can also add files from the host to the virtual machine and the other way around.
So With PowerShell I first create an VHD and mount it to the Host, create a partition and format it and then I copy the data I want to transfer and then also mount it to the VM.
New-VHD -Path c:\temp\MobileData.vhdx -Dynamic -SizeBytes 10GB | Select-Object Path | Mount-VHD Get-Disk | where PartitionStyle -eq "RAW" | Initialize-Disk -PartitionStyle MBR -PassThru | New-Partition -UseMaximumSize -AssignDriveLetter -MbrType IFS | Format-Volume -Confirm:$false | Select-Object DriveLetter | ft -AutoSize Copy-Item C:\ToVM -Destination E:\ -Recurse Dismount-VHD C:\temp\MobileData.vhdx Add-VMHardDiskDrive -VMName VMTest -Path C:\temp\MobileData.vhdx -ControllerType SCSI -ControllerNumber 0 -ControllerLocation 0
As you might know, why I use the SCSI controller is to be able to hot-add the virtual hard disk to the VM while it is running and not having to shut it down 🙂
The first time in the VM I have to do some massage on the disk before it appears but the next time the VM´s OS recoginize it and it can be used directly.
Get-Disk | where OperationalStatus -eq "Offline" | Set-Disk -IsReadOnly $false Get-Disk | where OperationalStatus -eq "Offline" | Set-Disk -IsOffline $false New-Item -Path E:\ToVM\ToHost -Type directory
And as you can see in the screendump above of the virtual machines folder with the files and also you can see that I can add data inside the VM to my virtual disk. If I would just use the Set-Disk -IsOffline $false I would get a volume that was write protected and here I wanted to add files and folders from the virtual machine also.
And when I am done moving files I can easily disconnect the disk from the VM from the host by using the following PowerShell cmdlet
Remove-VMHardDiskDrive -VMName VMTest -ControllerType SCSI -ControllerNumber 0 -ControllerLocation 0
This move folder and files way also works on the Windows 2012 Hyper-V!
Looking at the features in the Virtual PC compared to the client Hyper-V there are at lest two features I miss in the later,
- Easily copying files between virtual machine and host
- An network that can share the hosts without any extra manual configuration with the bridging creating a NAT solution out of the box.
Well you can´t get everything you wish for and some things you can create workarounds for 🙂
Comments
Kudos bro! Exactly what I was looking for. I believe this is the only workaround if you want to take a physically connected USB drive on host, and make it available to a VM.
Why don’t they make a direct passthru possible whereby a PS cmdlet would enable a physical disk on host appear on VM without having to go thru creating a VHDX and copying content?
Thanks Niklas
This is a perfect solution to the issue I was facing, worked like a charm, thanks for sharing your knowledge.