Уровень ошибки всегда 0 в командном файле

435
Paulo Francisco Santos

Я пытаюсь настроить скрипт автоматического развертывания из образа Windows. Во время тестирования я сталкиваюсь с проблемой, касающейся части, которая пытается перехватить, если что-то пошло не так с определенными командами.

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

Я попытался добавить elseк разделам, чтобы увидеть, что пошло не так, и я заметил, что уровень ошибки был равен 0 после выполнения команды. Если только эхо не устанавливает уровень ошибки. Вот соответствующий раздел кода.

Изменить: я выделил основную причину для этого раздела кода. Я также избавился от шага imagex, чтобы уменьшить сложность и переменные.

@echo off setlocal  set /p i_understand="Begin failure test? (Y/N) "  if "%i_understand%"=="Y" ( rem Deliberately causing diskpart to fail by using a nonexistent file. diskpart /s doesnotexist.txt if %ERRORLEVEL% NEQ 0 ( echo Diskpart failed and caught. endlocal exit /b 1 )  echo Diskpart failed but not caught. Error level is %ERRORLEVEL% ) else ( echo Variable i_understand is %i_understand% echo Aborting. ) 

Если я уменьшу код до приведенного ниже, уровень ошибки будет установлен правильно:

@echo off setlocal rem Deliberately causing diskpart to fail by using a nonexistent file. diskpart /s doesnotexist.txt if %ERRORLEVEL% NEQ 0 ( echo Diskpart failed and caught. endlocal exit /b 1 ) 

Идея состояла в том, чтобы отобразить предупреждения, а затем получить окончательный ответ с большой буквы «Y» для «Да, я знаю, что этот сценарий опасен, и я знаю, что я делаю». прежде чем приступить к любому другому вводу, интерпретируемому как отказ по безопасности.

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

Естественно, во время моих тестов я столкнулся с кучей сбоев из-за неверно настроенных переменных, но скрипт продолжал работать, как будто ничего не происходило.

1
Вы не сделали никаких действий по устранению неполадок, чтобы решить вашу проблему. Сделайте это проще, например, посмотрев, сможете ли вы воспроизвести проблему без ссылок на диск H. barlop 5 лет назад 1
Ваш пакетный файл имеет два теста: один с diskpart, другой с imagex. У всех нас есть diskpart, у всех нас нет imagex. Почему бы вам не удалить часть с помощью imagex, а просто показать часть диска, если действительно эта часть не работает должным образом. barlop 5 лет назад 0
Кроме того, базовые тесты могут показать вам, что эхо не влияет на уровень ошибки, так зачем спрашивать, если это так, когда вы можете так легко проверить и убедиться в этом сами barlop 5 лет назад 0
см. https://pastebin.com/raw/cswe0LqE о первой части вашего пакетного файла. Результаты ожидаемые для меня. Разве это не происходит для вас? И я получаю тот же (ожидаемый) результат с командным файлом тоже barlop 5 лет назад 0
Спасибо за советы. Я чувствую себя глупо. Кажется, что попытка использования битов кода сама по себе работает. Что-то, что произошло ранее в полном сценарии, может быть ответственным за это. Я вернусь с обновлением. Paulo Francisco Santos 5 лет назад 0
Нормально столкнуться с проблемой, с которой вы столкнулись, и когда вы обнаружите проблему, может показаться, что это было что-то глупое / очевидное, когда вы знаете, но когда вы не знаете, это не глупо / очевидно. И так на самом деле, поскольку никто не знает, когда, это не глупо / очевидно. Все проблемы такие. И окажется, что-то маленькое и где-то маленькое, что-то упущенное. Но ключ в том, чтобы задать правильный вопрос, который приведет вас к ответу. И ключом к этому является правильное устранение неполадок путем воспроизведения (или попытки воспроизвести) проблемы более простым способом. barlop 5 лет назад 0
Добавлено обновление. Он довольно большой, поэтому я немного отредактировал свой оригинальный вопрос. Paulo Francisco Santos 5 лет назад 0
Я не запускал diskpart с помощью скрипта раньше, но для ясности, будет запущена строка diskpart, а затем будет запущена следующая строка, поэтому, если в скрипте, переданном на diskpart, есть ошибка, а ошибка - нет заставьте diskpart выйти, затем diskpart продолжит выполнение скрипта. Если в скрипте, поданном на diskpart, нет ошибок, то diskpart продолжит выполнение скрипта. Что вы можете сделать, это написать некоторый код после строки diskpart, который определяет, работал ли он успешно barlop 5 лет назад 0
или в стороне от диска, в случае строки вашего изображения, например, для вашей строки imagex, возможно, будут использованы послесловия кода, если ожидаемый файл выводится и имеет ожидаемый размер. barlop 5 лет назад 0
Интересная перспектива для diskpart, но это не та проблема, которую я тестирую, хотя я должен попробовать ее позже. Дело в том, что я попытался заставить diskpart не работать, попросив вызвать несуществующий файл сценария. Само по себе это работает нормально: diskpart сообщает, что не может найти файл, и сценарий получает бит `exit / b`, корректно вызывая преждевременный выход сценария. Но если я сейчас помещу его в часть, которая теперь проверяет пользовательский ввод, diskpart по-прежнему завершается, потому что пытается найти несуществующий файл, но `% ERRORLEVEL%` по-прежнему равен 0 по какой-то причине. Paulo Francisco Santos 5 лет назад 0
Прошло много времени с тех пор, как я запутался в setlocal, но я замечаю, что если вы удалите setlocal и endlocal, то, похоже, вы получите правильный уровень ошибки. Также эта строка `echo Diskpart fail not not notpted` выглядит немного посреди ниоткуда , И работает ли он или нет меняется при удалении setlocal и endlocal barlop 5 лет назад 0

0 ответов на вопрос