Using the PowerShell cmdlet Copy-VMFile

To copy files to a VM using the Copy-VMFile cmdlet, we first have to enable Guest Services under Integration Services for a VM. Luckily, there is a PowerShell one-liner for this:

Enable IntegrationService for Guest

Enable-VMIntegrationService -Name "Guest ServiceInterface" -VMName "WS2019-DC01"

Now we are now ready to copy the file from the host (source) to the guest VM (destination) using the following command:

Copy File from Host To Guest VM

Copy-VMFile "WS2019-DC01" -SourcePath "D:\Test.txt" -DestinationPath "C:\Temp\Test.txt" -CreateFullPath -FileSource Host

However, you cannot use this command when you need to copy files from guest to host. You then need to create a PSSession and then run the command to copy files from guest to host.

Using PSSession for copy file from Guest to Host

<#
Solution: Microsoft Hyper-V Tool
 Purpose: Copy from Hyper-V Guest
 Version: 2.0.0
    Date: 12 March 2021

  Author: Tomas Johansson
 Twitter: @deploymentnoob
     Web: https://www.4thcorner.net

This script is provided "AS IS" with no warranties, confers no rights and 
is not supported by the author
#>

# Define a Microsoft .NET Core class in your PowerShell session
Add-Type -AssemblyName Microsoft.VisualBasic

# This command uses the PromptForCredential method to prompt the user for their user name and password.
# The command saves the resulting credentials in the $Credential variable.
$Credential = $Host.UI.PromptForCredential("Need credentials", "Please enter your User name and Password.", "", "NetBiosUserName")

# Server to use the PSSession to 
$ConnectToServer = [Microsoft.VisualBasic.Interaction]::InputBox('Input Server to connect to', 'Server Name', "")

# Create new PSSession to Server with specific Credential
$Session = New-PSSession -VMName $ConnectToServer -Credential $Credential

# Start interactive session with single remote computer
Enter-PSSession  -Session $Session

# Copy Items from Temp Diretory from remote computer and if file and overwrites existing files
Copy-Item -FromSession $Session -Path "C:\TEMP\*" -Destination "D:\Temp" -Force

# Closes the current session. also closes the connection between the local and remote computers
Remove-PSSession -Session $Session