2016-11-09 8 views
0

Я знаю о неприятном поведении powershell, касающемся синтаксических ошибок и кодов выхода. У меня есть следующий пример воспроизведения, который должен быть пойман либо ловушкой, либо блоком захвата try, но ни один из них не запускается, даже если $ErrorActionPreference установлен в stop.Не удается поймать или уловить ошибку синтаксиса

Этот код здесь держит выход с кодом ошибки 0, что весьма раздражает, как нет механизма ловушки не вызывается дело с ошибкой:

$ErrorActionPreference = "stop" 
trap [Exception] { 
    echo "Trap encountered" 
    exit(1) 
} 

Try 
{ 

    function foo($path, $path) 
    { 
    } 

} 

Catch 
{ 
    echo "Caught something" 
    exit(1) 
} 

Знает ли кто, как я могу обмануть PowerShell, чтобы правильно выйти в таких случаях ? Синтаксические ошибки в скриптах нарушают наш CI молча, что довольно проблематично.

Для ясности: Это было проверено и воспроизведены на Win 7 PS 3,0

Edit 2: Для того, чтобы избежать большего числа людей, говоря, что я не буду отлавливать ошибки синтаксиса этим. Powershell разработан с учетом того, что большинство других языков программирования или программирования вы знаете.

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

If you make a syntax error or run out of memory, that is a terminating error. Terminating errors can be caught and handled.

См http://www.vexasoft.com/blogs/powershell/7255220-powershell-tutorial-try-catch-finally-and-error-handling-in-powershell

+0

для меня это ошибки: "function foo ($ path, $ path) + ~~~~~ Дублировать параметр $ path в списке параметров." – 4c74356b41

+0

В моей системе функция 'powershell -command 'foo ($ a, $ a) {}" 'имеет код выхода из 1, а успешный запуск завершен с 0. Обнаружение ошибки из вашего CI должно быть по крайней мере выполнимо. Если вы действительно хотите обработать это из самого PowerShell, вы можете, конечно, вызывать рекурсивно (blech), или вы можете попытаться использовать ['Parser'] (https://msdn.microsoft.com/library/system.management.automation. language.parser) (начиная с версии 3.0) для анализа любых скриптов перед их выполнением. –

+0

@ 4c74356b41 Он делает, но никакой ловушки не вызывается, и если вы проверите код выхода, это будет 0, независимо от красного текста ошибки. – Samuel

ответ

0

Я думаю, что PS Analyzer Script делает то, что вы хотели бы это сделать. https://github.com/PowerShell/PSScriptAnalyzer

Так что для меня это работает так:

попробовать {Invoke-ScriptAnalyzer -ErrorAction Stop -Path \.} {Задвижка Write-Output $ _} Invoke-ScriptAnalyzer: Ошибка синтаксического анализа в файле C: \ Пользователи \ gleb_boushev \ Desktop \ Untitled2.ps1: Дублировать параметр $ path в списке параметров в строке 10 столбец 24.

1

Ошибки при попытке/уловке уловов, а не ошибки парсера. Ошибки Parser произойдут, прежде чем powershell даже начнет выполнение скрипта. Вместо того, чтобы напрямую ссылаться на свой скрипт, вы можете называть его с помощью вспомогательного скрипта, который, как известно, всегда имеет хороший синтаксис. например ScriptInvoker.ps1

param (
    [Parameter(Mandatory=$true,Position=1)] 
    [string]$Path 
) 
$ErrorActionPreference = "stop" 

try { &$Path } 
catch { exit(1) } 

Теперь ваша система CI просто нужно выводить ваш темп сценария temp.ps1, но вместо вызова powershell -File temp.ps1 используйте powershell -File ScriptInvoker.ps1 temp.ps1.

+0

. Ваше предположение о powershell кажется неправильным:> Если вы делаете синтаксическую ошибку или заканчиваете память, это является завершающей ошибкой. Заканчивающиеся ошибки можно поймать и обработать. http://www.vexasoft.com/blogs/powershell/7255220-powershell-tutorial-try-catch-finally-and-error-handling-in-powershell – Samuel

+0

Почему вы говорите, что синтаксическая ошибка является завершающей ошибкой. Завершающая ошибка происходит во время * выполнения * powershell. Синтаксический сбой происходит до того, как какой-либо код даже начнет выполнение. – Alex

+0

Я не говорю это, это цитата из упомянутой ссылки в моем комментарии. Более того, он работает на Win 10 – Samuel