通过捕获块Powershell时出错

时间:2018-11-09 16:56:43

标签: powershell

我编写了一个脚本来检查Windows x64主机密钥中Firefox的文件路径。它具有一个try catch块,在括号中具有完全限定的错误ID。

尽管错误消息与代码中的内容相同,但未捕获到错误。

 $program = "FireFox"

 $filepath = "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"

 $FPF = $filepath + "\" + $program 

 try { Get-ChildItem $FPF} 

     catch [PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand] {

         if ($_.Exception.Message -match "Get-ChildItem : Cannot find path*") {

             Write-Host "false"}
     }

出现的全部错误是

Get-ChildItem : Cannot find path 'HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\FireFox' because it does not exist. At line:7 char:7 + try { Get-ChildItem $FPF} + ~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (HKEY_LOCAL_MACH...install\FireFox:String) [Get-ChildItem], ItemNotFoundException + FullyQualifiedErrorId :PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

可能是什么问题?

1 个答案:

答案 0 :(得分:1)

您已经发现,您可以通过使用Test-Path cmdlet预先确定给定路径是否存在,以及< em> existence 是您所关心的,就足够了:if (Test-Path $FPF) { ... }

一般来说,但是,即使路径存在,您在遍历上仍然可能会遇到错误。


要解决您的原始尝试:存在两个基本问题:

  • 正如Matt在评论中指出的, Get-ChildItem未找到给定路径会导致非终止错误,而{{1 }} / try仅适用于终止错误

    • 不过,您可以通过在命令中添加通用参数catch来将非终止错误提升为终止错误。

    • 有关PowerShell错误类型及其处理的摘要,请参见this GitHub post

  • 要限定条件-ErrorAction Stop处理程序,您必须使用异常类型文字,例如catch 不是错误记录的[System.Management.Automation.ItemNotFoundException]属性(例如.FullyQualifiedErrorId)的值

    • 要确定错误记录的异常类型的全名,请在错误发生后运行以下命令:
      • PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

这是基于上述内容的代码的修订版:

$Error[0].Exception.GetType().FullName