У меня есть скрипт 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.