Suppress Error Messages in PowerShell at get-package

Viewed 54

I use PowerShell to check, if specific apps are installed on the users PC:

$Application_MicrosoftEdge   = get-package "Microsoft Edge" | % { $_.metadata['installlocation'] }
$Application_Microsoft365    = get-package *"Microsoft 365"* | % { $_.metadata['installlocation'] }
Write-Host "Microsoft Edge Path    : $Application_MicrosoftEdge"
Write-Host "Microsoft 365 Path     : $Application_Microsoft365"

This works quiet well, but if an application is not installed on the users PC, then an error message is shown (here "Microsoft 365" is not installed on the PC):

get-package : Für "*Microsoft 365*" wurde kein Paket gefunden.
In D:\Scripts\GetInstalledApp.ps1:12 Zeichen:32
+ $Application_Microsoft365    = get-package *"Microsoft 365"* | % { $ ...
+                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Microsoft.Power...lets.GetPackage:GetPackage) [Get-Package], Exception
    + FullyQualifiedErrorId : NoMatchFound,Microsoft.PowerShell.PackageManagement.Cmdlets.GetPackage

I tried the following way, but here an error message is shown:

Try {
  $Application_MicrosoftEdge   = get-package "Microsoft Edge" | % { $_.metadata['installlocation'] }
   $Application_Microsoft365    = get-package *"Microsoft 365"* | % { $_.metadata['installlocation'] }
}
Catch {
  # Place action on error here
}

I also tried to wrap it in $( ... ) | out-null to suppress the error, but this is also not working. ` Any idea?

1 Answers

The simplest way is to pass argument Ignore for common parameter -ErrorAction (-EA):

$Application_MicrosoftEdge   = get-package "Microsoft Edge" -EA Ignore | % { $_.metadata['installlocation'] }
$Application_Microsoft365    = get-package *"Microsoft 365"* -EA Ignore | % { $_.metadata['installlocation'] }

if( $Application_MicrosoftEdge ) {
    Write-Host "Microsoft Edge Path    : $Application_MicrosoftEdge"
}
if( $Application_Microsoft365 ) {
    Write-Host "Microsoft 365 Path     : $Application_Microsoft365"
}

On error, the pipeline output will be empty, which converts to $false in a boolean context, which we test using the if statements.


Alternatively, as Abraham Zinala commented, to make try/catch working, pass argument Stop for common parameter -ErrorAction (-EA) or set the preference variable $ErrorActionPreference = 'Stop' at the beginning of your script:

try {
    $Application_MicrosoftEdge   = get-package "Microsoft Edge" -EA Stop | % { $_.metadata['installlocation'] }
    $Application_Microsoft365    = get-package *"Microsoft 365"* -EA Stop | % { $_.metadata['installlocation'] }
}
catch {
    # Place action on error here
}

Using -EA Stop, errors are turned into script-terminating errors (exceptions), which must be caught using try / catch, otherwise the script would end prematurely.

Note that this code skips the 2nd get-package call, if the 1st one failed! This is because execution flow jumps straight from the first error location into the catch block. To handle errors separately for both get-package calls, you'd need two try / catch blocks.

Related