Update-IntegrationServices.PS1

You need to copy the integration services on a file share that can be accessed by your VM's. These files will be copied to the VM to run the IS Setup. You can find the proper binaries on a Hyper-V Server, in the VMGuest.ISO file, which is typically under c:\windows\system32.Copy the files that contain the AMD64 x86 folders. 
Then create a file containing the VM's you want to patch. Each VM is one line in the text file.
It is recommended to patch the Hyper-V Host first to make sure you have the latest integration services!

PowerShell
Edit|Remove
<# 
 
.SYNOPSIS 
This script will update integration services on your VM's.  
 
 
.DESCRIPTION 
You need to copy the integration services on a file share that can be accessed by your VM's.  
These files will be copied to the VM to run the IS Setup. You can find the proper binaries on a Hyper-V Server, in the VMGuest.ISO file, which is typically under c:\windows\system32. 
Copy the files that contain the AMD64 x86 folders. 
It is recommended to patch the Hyper-V Host first to make sure you have the latest integration services! 
 
.EXAMPLE 
./Update-IntegrationServices.ps1 -ISBinaries \\fileserver\IntegrationServices -ServerFile C:\temp\servers.txt -LogFile c:\temp\ISInstallation.log -Restart $True 
 
.NOTES 
 
 
.LINK 
https://noalertleftbehind.blog 
 
#> 
 
 
[CmdletBinding()] 
Param( 
    [Parameter(Mandatory=$True)] 
    [String] 
    $ISBinaries, 
    [Parameter(Mandatory=$True)] 
    [String] 
    $ServerFile, 
    [Parameter(Mandatory=$True)] 
    [String] 
    $LogFile, 
    [Parameter(Mandatory=$True)] 
    [Boolean] 
    $Restart 
    ) 
 
#Read the predefined text file that contains the server that requires the patches. 
$Servers = get-content -path $ServerFile 
 
#region Logging 
 
#Check if the LogFile exists 
$CheckLog = Get-Item -Path $LogFile -ErrorAction SilentlyContinue 
If(!$CheckLog) 
{ 
    New-Item -Path $LogFile -Type File 
} 
 
#Function to write to logfile 
Function Write-Log { 
    [CmdletBinding()] 
    Param( 
    [Parameter(Mandatory=$False)] 
    [ValidateSet("INFO","WARN","ERROR","FATAL","DEBUG")] 
    [String] 
    $Level = "INFO", 
 
    [Parameter(Mandatory=$True)] 
    [string] 
    $Message, 
 
    [Parameter(Mandatory=$False)] 
    [string] 
    $LogFile 
    ) 
 
    $Stamp = (Get-Date).toString("yyyy/MM/dd HH:mm:ss") 
    $Line = "$Stamp $Level $Message" 
    If($logfile) { 
        Add-Content $LogFile -Value $Line 
    } 
    Else { 
        Write-Output $Line 
    } 
} 
#endregion 
 
 
 
#region Install Integration Services     
Foreach($Server in $Servers) 
{ 
                                                                                                                                                  
 
    #Set the directory to place the binaries. 
    $InstallDirectory = "\\$Server\c$\temp\IntegrationServices" 
    #Check if the directory is already present, if it is, do not create it 
 
    $TempDirectory = get-item "\\$Server\c$\temp\IntegrationServices" -ErrorAction SilentlyContinue 
 
    If(!$TempDirectory) 
        { 
            New-Item -ItemType directory -path $InstallDirectory -Force -ErrorAction SilentlyContinue 
            $TempDirectory = get-item "\\$Server\c$\temp\IntegrationServices" -ErrorAction SilentlyContinue 
            #Check if the folder is created, if not, log it as an error and skip the server. 
                If(!$TempDirectory) 
                    { 
                    Write-Log -Level ERROR -Message "Failed to create $InstallDirectory on $Server, will not continue installation" -LogFile $Logfile 
                    Continue  
                    } 
                Else 
                    { 
                    Write-Log -Level INFO -Message "Created $InstallDirectory on $Server" -LogFile $Logfile 
                    } 
  
        } 
    #Copy binaries and overwrite regardless 
    Copy-Item -path $ISBinaries -Destination $InstallDirectory -Recurse -Force -ErrorAction SilentlyContinue 
    Write-Log -Level INFO -Message "Copied binaries to $Server" -LogFile $Logfile 
    #Start the installation after copy process has been done. Verify if the server has to be restarted. 
    If($Restart -eq $True)  
        { 
            Invoke-Command –ComputerName $Server -ScriptBlock ` 
            { 
                Start-Process -WorkingDirectory "C:\temp\IntegrationServices\amd64" -FilePath "setup.exe" -Args '/quiet' -Wait 
            } 
        } 
    Else 
        { 
            Invoke-Command –ComputerName $Server -ScriptBlock ` 
            { 
                Start-Process -WorkingDirectory "C:\temp\IntegrationServices\amd64" -FilePath "setup.exe" -Args '/quiet /norestart' -Wait 
            } 
        } 
    Write-Log -Level INFO -Message "Installed Integration Services on $Server" -LogFile $LogFile 
    Write-Host "$Server done" 
} 
#endregion