Bislang war es unter Hyper-V etwas umständlich Dateien vom Hyper-V-Host in eine virtuelle Maschine zu kopieren. Entweder musste man eine Netzwerkverbindung zwischen dem Host und der virtuellen Maschine aufbauen, oder z.B. eine ISO-Dateien mit den zu kopierenden Dateien anfertigen und diese als optisches Laufwerk in die virtuelle Maschine einbinden. Mit Windows 8.1 und Windows Server 2012 R2 ist das Kopieren von Dateien in eine virtuelle Maschine ab sofort – dank Hyper-V 2012 R2 – möglich.
PowerShell-Cmdlet „Copy-VMFile“ (TechNet):
Syntax:
Copy-VMFile [-Name] <String[]> [-SourcePath] [-DestinationPath] -FileSource [-AsJob] [-ComputerName <String[]> ] [-CreateFullPath] [-Force] [-Confirm] [-WhatIf] [ ]
Beispiel:
PS C:\Copy-VMFile "Test VM" -SourcePath “D:\Test.txt” -DestinationPath "C:\Temp\Test.txt" -CreateFullPath -FileSource Host
Damit das ganze funktioniert, müssen zuvor unter den Integrationsdiensten die (neuen) Gastdienste aktiviert werden. Dies kann entweder über den Hyper-V-Manager oder mit folgendem Powershell-Befehl erfolgen.
Enable-VMIntegrationService -VMName "Name der VM" -Name "Guest Service Interface"
Um die Gastdienste auf allen Maschinen zu aktivieren, die auf den Hyper-V-Host laufen, reicht folgender Befehl aus:
Enable-VMIntegrationService -VMName "*" -Name "Guest Service Interface"
Zur Kontrolle eignet sich folgender Befehl:
get-VMIntegrationService * -Name Gastdienstschnittstelle | format-list vmname, enabled
Da dies immer noch etwas umständlich ist, habe ich ein PowerShell-Skript erstellt, das die zu kopierende Datei über ein Explorer-Fenster abfragt und nach anschließender Eingabe der Ziel-VM die gewählte Datei in einen fest definierten Ordner kopiert. Außerdem wird die Gastdienstschnittstelle aktiviert.
Das Ergebnis sieht wie folgt aus:
Das PowerShell-Skript:
## Copy Files from Hyper-V-Host to VM ## ## by André Picker - www.clientmgmt.de ## Add-Type -AssemblyName System.Windows.Forms $quellpfad = New-Object System.Windows.Forms.OpenFileDialog -Property @{ initialdirectory = [Environment]::GetFolderPath("Desktop") } [void]$quellpfad.ShowDialog() $filename = $quellpfad.SafeFileName $localfilepath = $quellpfad.FileName $zielvm = Read-Host "Please Enter VMName" Enable-VMIntegrationService -VMName "$zielvm" -Name "Guest Service Interface" copy-VMFile -vmname "$zielvm" -ComputerName localhost -SourcePath "$localfilepath" -DestinationPath "c:\hyper-v\$filename" -FileSource Host -CreateFullPath
Download: copyvm.zip
Vielleicht findet sich ja jemand, der die Powershell-Parameter vollständig hinter eine GUI verpackt.