PowerShell中Get-Package命令错误消息抑制方法求助
PowerShell检查已安装应用时抑制无匹配错误的解决办法
当使用Get-Package检查应用是否安装时,若目标应用未安装,命令会抛出非终止错误,常规的Try/Catch或Out-Null无法有效抑制或捕获——原因是这类错误默认不会终止脚本执行,Try/Catch仅对终止错误生效。以下是两种可行的解决方式:
方法一:将非终止错误转为终止错误,用Try/Catch捕获
给Get-Package添加-ErrorAction Stop参数,把找不到包的非终止错误转为终止错误,这样就能被Try/Catch捕获并处理:
Try { $Application_MicrosoftEdge = Get-Package "Microsoft Edge" -ErrorAction Stop | ForEach-Object { $_.metadata['installlocation'] } $Application_Microsoft365 = Get-Package *"Microsoft 365"* -ErrorAction Stop | ForEach-Object { $_.metadata['installlocation'] } } Catch { # 根据错误信息匹配未找到的应用,赋值为"未安装" switch -Regex ($_.Exception.Message) { "Microsoft 365" { $Application_Microsoft365 = "未安装" } "Microsoft Edge" { $Application_MicrosoftEdge = "未安装" } } } Write-Host "Microsoft Edge Path : $Application_MicrosoftEdge" Write-Host "Microsoft 365 Path : $Application_Microsoft365"
方法二:直接抑制错误输出,事后判断结果
使用-ErrorAction SilentlyContinue参数屏蔽错误输出,之后通过判断变量是否为空来处理未安装的情况:
$Application_MicrosoftEdge = Get-Package "Microsoft Edge" -ErrorAction SilentlyContinue | ForEach-Object { $_.metadata['installlocation'] } $Application_Microsoft365 = Get-Package *"Microsoft 365"* -ErrorAction SilentlyContinue | ForEach-Object { $_.metadata['installlocation'] } # 为空则标记为未安装 if (-not $Application_MicrosoftEdge) { $Application_MicrosoftEdge = "未安装" } if (-not $Application_Microsoft365) { $Application_Microsoft365 = "未安装" } Write-Host "Microsoft Edge Path : $Application_MicrosoftEdge" Write-Host "Microsoft 365 Path : $Application_Microsoft365"
补充说明
PowerShell的错误分为两类:
- 终止错误:会立即终止脚本执行,可被
Try/Catch捕获 - 非终止错误:仅输出错误信息,脚本继续执行,默认无法被
Try/Catch捕获
Get-Package未找到匹配包时抛出的是非终止错误,因此需要通过-ErrorAction参数调整错误处理行为,才能实现预期的错误抑制或捕获。
内容的提问来源于stack exchange,提问作者OLLI_S
相关产品推荐
相关产品推荐

