Оператор вызова Powershell (&) с несуществующим путем в блоке try-finally вызывает ошибку завершения - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть скрипт Powershell (script1.ps1) со следующим содержимым:

Write-Output "Script1 - Start"
& ".\nonexistent.ps1"
Write-Output "Script1 - End"

nonexistent.ps1, очевидно, несуществующий файл. У меня есть другой скрипт (script2.ps1), который в какой-то момент вызывает script1.ps1:

& ".\script1.ps1"

Запуск script2.ps1 создает следующий вывод:

Script1 - Start
& : The term '.\nonexistent.ps1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At C:\scripts\script1.ps1:2 char:3
+ & ".\nonexistent.ps1"
+   ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (.\nonexistent.ps1:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Script1 - End

Таким образом, в этом случае выполнение несуществующего сценария является нескончаемой ошибкой, поскольку код после него выполняется без проблем.

Моя проблема заключается в следующем: я заменяю код, который вызывает script1.ps1, следующим образом:

Try {
    & ".\script1.ps1"
} Finally {
    Write-Output "Script2 - Finally"
}

И вывод становится таким:

Script1 - Start
Script2 - Finally
& : The term '.\nonexistent.ps1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At C:\scripts\script1.ps1:2 char:3
+ & ".\nonexistent.ps1"
+   ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (.\nonexistent.ps1:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Таким образом, в этом случае вызов несуществующего скрипта стал завершающей ошибкой, так как код после этого не выполняется. Еще более странным является то, что ошибка фактически появляется после запуска блока finally. Мой вопрос: почему это происходит и каково было бы правильное решение, если я не хочу «случайно» преобразовывать не завершающиеся ошибки в завершающие ошибки при использовании блока try-finally.

...