Ошибка при прохождении через перехват блока powershell - PullRequest
0 голосов
/ 09 ноября 2018

Я написал скрипт для проверки пути к файлу для Firefox в Windows x64 Host Key.В блоке try catch есть полный идентификатор ошибки в скобках.

Несмотря на то, что сообщение об ошибке совпадает с кодом в коде, оно не перехватывает ошибку.

 $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 голосов
/ 10 ноября 2018

Как вы обнаружили, вы можете обойти необходимость вашей попытки обработки исключений с помощью командлета Test-Path, чтобы определить, существует ли данный путь - и если существование - это все, о чем вы заботитесь, этого достаточно:

В общем случае , однако, даже если путь существует , вы все равно можете столкнуться с ошибками при traversal .


Для решения вашей первоначальной попытки: есть две фундаментальные проблемы:

  • Как Мэтт указывает в комментарии, Get-ChildItem, не найдя заданный путь, приводит к не прекращающейся ошибке, тогда как try / catch относится только к завершению ошибок .

    • Однако вы можете повысить нескончаемых ошибок до завершающих, добавив в команду общий параметр -ErrorAction Stop.

    • Сводка типов ошибок PowerShell и их обработки приведена в этом сообщении GitHub .

  • Чтобы квалифицировать условные catch обработчики, вы должны использовать литералы типа исключения , например, [System.Management.Automation.ItemNotFoundException], не значение свойство .FullyQualifiedErrorId записи об ошибке (например, PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand)

    • Чтобы определить полное имя типа исключения записи об ошибке, выполните следующую команду после возникновения ошибки:
      • $Error[0].Exception.GetType().FullName

Вот исправленная версия вашего кода, основанная на вышеупомянутом:

try {
    Get-ChildItem $FPF -ErrorAction Stop
} catch [System.Management.Automation.ItemNotFoundException] { # input path not found
    Write-Error "Not found: $FPF"
} catch {  # any other error
    Throw "An unexpected error occurred: $_"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...