Завершение сценария в PowerShell

Я искал способ завершить PowerShell (PS1) сценарий, когда неисправимая ошибка происходит в функции. Например:

function foo() {
    # Do stuff that causes an error
    $host.Exit()
}

Конечно, нет такой вещи как $host.Exit(). Существует $host.SetShouldExit(), но это на самом деле закрывает консоль, которая не является тем, что я хочу. То, в чем я нуждаюсь, является чем-то эквивалентным Python sys.exit() это просто остановит выполнение текущего сценария без далее прощайте.

Править: Да, это справедливо exit. Понятное дело.

371
задан Peter Mortensen 30 November 2014 в 14:12
поделиться

2 ответа

Вы должны использовать ключевое слово exit.

364
ответ дан 23 November 2019 в 00:04
поделиться

Я думал об этом долго и тяжело, когда дело доходит до предоставления руководства по отладке против утверждения в отношении проблем тестирования.

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

Хорошие правила большого пальца, к которым я пришел:

  1. Утверждения не являются заменой надежного кода, который функционирует правильно независимо от конфигурации. Они дополняют друг друга.

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

  3. При подтверждении сбоев (либо в ходе единичного теста, либо во время тестирования) класс прослушивается.

Для всех других ошибок - обычно вплоть до среды (сетевое соединение потеряно) или неправильного использования (вызывающий абонент передал нулевое значение) - гораздо лучше и понятнее использовать жесткие проверки и исключения. Если возникает исключение, вызывающий абонент знает, что это его вина. Если происходит утверждение, вызывающий абонент знает, что это, вероятно, ошибка в коде, где находится утверждение.

Что касается дублирования: я согласен. Я не понимаю, почему вы бы реплицировать проверку с Debug.Assert И проверки исключения. Это не только добавляет некоторый шум в код и мутит воды относительно того, кто виноват, но это форма повторения.

-121--1314488-

HTML5 вводит понятие пользовательских атрибутов данных , которые может создать любой пользователь для присоединения пользовательских скрытых данных к элементам в целях создания сценариев. Просто создайте атрибут, используя префикс data- , например data-myattr1 или data-myattr2 , и заполните его своими данными.

<div data-myattr1="myvalue1" data-myattr2="myvalue2">Content</div>

Приятно, что это решение уже работает во всех основных браузерах; все они будут анализировать неизвестные атрибуты и предоставлять их в DOM для доступа по JavaScript. HTML5 добавляет несколько удобных механизмов доступа к ним, которые еще не реализованы, но для доступа к ним на данный момент можно просто использовать стандартный getAttribute . И тот факт, что они разрешены в HTML5, означает, что ваш код будет подтвержден, если вы готовы использовать проект стандарта в отличие от принятого (я не верю, что атрибуты data- являются особенно спорными, однако, поэтому я был бы удивлен, если бы они были удалены из стандарта).

Преимущество, которое это имеет по сравнению с атрибутами пространства имен в XHTML, заключается в том, что IE не поддерживает XHTML, поэтому вам придется реализовать что-то, что претендует на использование атрибутов пространства имен, но на самом деле просто использует недопустимые атрибуты с : в их имени, то есть как IE будет анализировать их. Это лучше, чем использовать класс , потому что вложение большого количества данных в атрибут класса перегружает его довольно сильно,и включает в себя необходимость выполнения дополнительного синтаксического анализа для извлечения различных частей данных. И это лучше, чем просто создать свой собственный (который будет работать в текущих браузерах), потому что хорошо определено, что эти атрибуты с префиксом data- являются личными фрагментами данных для создания сценариев, и поэтому ваш код будет проверяться в HTML5 и никогда не будет конфликтовать с будущими стандартами.

Другой малоизвестный метод добавления пользовательских данных в HTML, который действителен даже в HTML- 4, это добавление элементов script с атрибутами type чего-либо, кроме text/javascript (или одного из пары других типов, которые можно использовать для указания JavaScript). Эти блоки скриптов будут игнорироваться браузерами, которые не знают, что с ними делать, и вы можете получить к ним доступ через DOM и делать с ними то, что хотите. HTML5 явно обсуждает это использование , но нет ничего, что делает его недействительным в старых версиях, и он работает во всех современных браузерах, насколько я знаю. Например, если вы хотите использовать CSV для определения таблицы данных:

<div>
  <script type="text/csv;header=present">
    id,myattr1,myattr2
    something,1,2
    another,2,4
  </script>
  Content
</div>

Это метод, используемый SVG Web для внедрения SVG в HTML, с эмуляцией через Flash, если браузер не поддерживает собственный SVG. В настоящее время даже браузеры, которые поддерживают SVG (Firefox, Safari, Chrome, Opera), не поддерживают его непосредственно в формате HTML, они поддерживают его только непосредственно в формате XHTML (поскольку элементы SVG находятся в другом пространстве имен). SVG Web позволяет поместить SVG inline в HTML, используя тег сценария, и затем он преобразует эти элементы в соответствующее пространство имен и добавляет их в DOM, чтобы они могли быть визуализированы как XHTML. В браузерах, которые не поддерживают SVG, он также эмулирует функцию элементов с помощью Flash.

-121--1480085-

Может быть, лучше использовать "ловушку". Ловушка PowerShell указывает кодовый блок, запускаемый при завершении или ошибке. Введите

Get-Help about_trap

для получения дополнительных сведений о инструкции trap.

12
ответ дан 23 November 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: