This function will download the latest Windows SysInternals Suite, compare all files and replace any that have been updated. This is quicker than manually downloading the entire suite package and copying over all of its contents, and can be done in a single simple command. This can be added to a current PowerShell module or pasted directly into PowerShell or PowerShell ISE. Further examples are included within the function. Updated on 08-28-19 to use TLS 1.2 or above Code: Function Update-SysInternals { <# .SYNOPSIS Automatically updates any SysInternals Suite utility with its most recent file version. .DESCRIPTION Automatically updates any SysInternals Suite utility with its most recent file version. .PARAMETER SuitePath The directory path to the SysInternals Suite utilities. .EXAMPLE PS C:\> Update-SysInternals -SuitePath "C:\SysInternalsSuite" PS C:\> "C:\Tools and Utilities\SysInternals" | Update-SysInternals #> [CmdletBinding()] Param ( [Parameter(Mandatory = $true, Position = 0, HelpMessage = 'The directory path to the SysInternals Suite utilities.')] [ValidateScript({ Test-Path -Path (Resolve-Path -Path $_) })] [string]$SuitePath ) Begin { If (!(Test-Connection -ComputerName $Env:COMPUTERNAME -Quiet)) { Write-Warning "The update requires an active internet connection."; Return } $ProcessPath = Get-Process -Name ZoomIt*, Desktops*, procexp* -ErrorAction SilentlyContinue | Where-Object -Property Name -NotLike *64 | Select-Object -Property Path Get-Process -Name ZoomIt*, Desktops*, procexp* -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue $ArchiveURL = "http://live.sysinternals.com/Files/SysinternalsSuite.zip" $ArchivePath = Join-Path -Path $Env:TEMP -ChildPath SysinternalsSuite.zip } Process { Write-Host "Beginning Update..." -NoNewline -ForegroundColor Cyan [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 (New-Object System.Net.WebClient).DownloadFile($ArchiveURL, $ArchivePath) $Current = Get-ChildItem -Path $SuitePath -Force $Updated = Get-ChildItem -Path $SuitePath -Force Expand-Archive -LiteralPath $ArchivePath -DestinationPath $SuitePath -Force Compare-Object -ReferenceObject $Current -DifferenceObject $Updated | Select-Object -ExpandProperty InputObject | ForEach-Object -Process { Get-ChildItem -Path ($SuitePath + '\' + $($_)) -Force } | Select-Object -Property Name, CreationTime Write-Host "[Complete]" -ForegroundColor Cyan } End { If ($ProcessPath) { $ProcessPath | ForEach-Object -Process { Start-Process -FilePath $($_.Path) -ErrorAction SilentlyContinue } } Remove-Item -Path $ArchivePath -Force -ErrorAction SilentlyContinue } }