Автоматически останавливать скрипт powershell при ошибках bat - PullRequest
3 голосов
/ 22 июня 2011

Обычно можно использовать $ ErrorActionPreference, чтобы остановить выполнение сценария PS при ошибке, как в примере ниже, в котором используется недопустимая команда subversion. Сценарий завершается после первой команды.

$ErrorActionPreference='Stop'
svn foo
svn foo

При попытке выполнить то же самое с помощью команды maven (mvn.bat) выполняются обе команды.

$ErrorActionPreference='Stop'
mvn foo
mvn foo

Изначально я подозревал, что mvn.bat не устанавливает код ошибки, а PS просто не видит ошибку. Тем не менее, $? установлен правильно, как показано ниже, когда PS выходит после первой ошибки:

mvn foo
if (-not $?) {exit 1}
mvn foo

Итак, вот мой вопрос: учитывая, что svn.exe и mvn.bat устанавливают код ошибки при сбое, почему скрипт PS не останавливается после ошибки mvn. Я считаю, что намного удобнее устанавливать «$ ErrorActionPreference = Stop» глобально, чем делать «if (-not $?) {Exit 1}» после каждой команды, завершающейся при ошибке.

Ответы [ 2 ]

1 голос
/ 02 августа 2013

$ ErrorActionPreference управляет поведением PowerShell в отношении командлетов и функций PowerShell - оно не чувствительно к кодам выхода «устаревших» команд. Я все еще ищу обходной путь для этого дизайнерского решения - для этой проблемы обратитесь к этой теме: Как остановить сценарий PowerShell при первой ошибке? . Вы, вероятно, придете к выводу, что эта пользовательская функция "exec" является лучшим решением: http://jameskovacs.com/2010/02/25/the-exec-problem/

Что касается поведения stop-on-stderr, я не могу воспроизвести это поведение в PowerShell 3:

Invoke-Command
{
  $ErrorActionPreference='Stop'
  cmd /c "echo hi >&2"          # Output to stderr (this does not cause termination)
  .\DoesNotExist.exe            # Try to run a program that doesn't exist (this throws)
  echo bye                      # This never executes
}

Обновление: Кажется, что поведение stop-on-stderr вступает в силу при использовании удаленного взаимодействия PS.

1 голос
/ 22 июня 2011

Не все программы командной строки выдают ошибки одинаково. Некоторые устанавливают код выхода. Некоторые нет. Некоторые используют поток ошибок, некоторые нет. Я видел, как некоторые программы командной строки на самом деле выводят все на ошибки и всегда выводят ненулевые коды возврата.

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

$ errorActionPreference фактически останавливает сценарий всякий раз, когда .exe записывает в поток ошибок, но многие .exes записывают регулярные выходные данные в консоль и никогда не заполняют поток ошибок.

Но это не будет надежно работать. Также, в этом отношении, не будет $ ?. Если exe возвращает 0 и не пишет в ошибку $? будет правдой.

Хотя может возникнуть проблема с каждым из этих отдельных файлов .exes и их ошибками в PowerShell, это прекрасный пример того, почему PowerShell хорошо структурировал потоки вывода / ошибок / подробностей / предупреждений / отладки / выполнения и согласованности ошибка поведения в командлетах выбивает старые старые .EXE инструменты.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...