$Uninstall = $false $UKeys = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*', 'HKLM:\SOFTWARE\Wow6432node\Microsoft\Windows\CurrentVersion\Uninstall\*' #If certain products need additional command line switches, add the switches here: $ProductData = @( [PSCustomObject]@{DisplayName = ''; AdditionalUninstallArgument ='' } [PSCustomObject]@{DisplayName = ''; AdditionalUninstallArgument ='' } ) foreach ($UKey in $UKeys) { foreach ($Product in (Get-ItemProperty $UKey)) { if ( $Product.Publisher -match "sophos") { write-host "============================================================================================" Write-host $Product.DisplayName #Get any additional argument for the application as defined in ProductData $additionalArgument = $ProductData.Where{$_.DisplayName -eq $Product.DisplayName}.AdditionalUninstallArgument if ($Product.UninstallString -like "msiexec*") #MSI based - case insensitive match to see if it requires msiexec to remove. { $ProductCode = $Product.PSChildName #can use the key name as it's the ProductCode. write-host "msiexec","/qn","/X$ProductCode","REBOOT=ReallySuppress" if ($Uninstall){Start-Process -Wait -NoNewWindow -FilePath "msiexec.exe" -ArgumentList "/qn","/X$ProductCode","REBOOT=ReallySuppress" -RedirectStandardOutput "NUL"} } else #non MSI { if ($Product.QuietUninstallString) #There is a quiet uninstall string for this product, helpful! { write-host "QuietUninstallString: " $Product.QuietUninstallString if ($Uninstall){& $env:ComSpec /c $Product.QuietUninstallString} } else { write-host "UninstallString: " $Product.UninstallString if ($additionalArgument) { write-host $Product.UninstallString $additionalArgument if ($Uninstall){& $env:ComSpec /c $Product.UninstallString $additionalArgument} } else { write-host $Product.UninstallString if ($Uninstall){& $env:ComSpec /c $Product.UninstallString} } } } } } }