Вы здесь сбились с пути.
У вас уже есть большое сообщение об ошибке. Зачем вам писать код, который $?
явно проверяет каждую команду ? Это чрезвычайно громоздко и подвержено ошибкам. Правильное решение - прекратить проверку$?
.
Вместо этого используйте встроенный механизм PowerShell, чтобы взорвать вас. Вы включаете его, установив предпочтение ошибок на самый высокий уровень:
$ErrorActionPreference = 'Stop'
Я помещаю это в начало каждого сценария, который когда-либо писал, и теперь мне не нужно проверять $?
. Это делает мой код намного проще и надежнее.
Если вы столкнетесь с ситуациями, когда вам действительно нужно отключить это поведение, вы можете либо catch
указать ошибку, либо передать настройку определенной функции, используя общий -ErrorAction
. В вашем случае вы, вероятно, хотите, чтобы ваш процесс остановился при первой ошибке, перехватил ошибку и затем зарегистрировал ее.
Обратите внимание, что это не относится к случаю, когда внешние исполняемые файлы терпят неудачу (обычно код выхода ненулевой), поэтому вам все равно нужно проверить $LASTEXITCODE
, вызываете ли вы какой-либо. Несмотря на это ограничение, настройка по-прежнему позволяет сэкономить много кода и усилий.
Дополнительная надежность
Вы также можете рассмотреть возможность использования строгого режима :
Set-StrictMode -Version Latest
Это препятствует тому, чтобы PowerShell молча продолжал работу, когда вы используете несуществующую переменную и в других странных ситуациях. ( -Version
Подробнее о том, что он ограничивает, см. В параметре.)
Сочетание этих двух настроек делает PowerShell гораздо более отказоустойчивым языком, что значительно упрощает программирование на нем.