Я пытаюсь настроить скрипт автоматического развертывания из образа 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" для «Да, я знаю, что этот сценарий опасен, и я знаю, что я делаю». прежде чем приступить к любому другому вводу, интерпретируемому как отказ по безопасности.
Конечно, многие вещи могут пойти не так во время процесса. Возможно, подключение к сетевому диску оборвано, что-то делает целевой диск недоступным или что-то еще непредвиденное приводит к сбою одной из команд. В этом случае скрипт останавливает все, что он делает, и оставляет журнал вывода консоли до этого момента.
Естественно, во время моих тестов я столкнулся с кучей сбоев из-за неверно настроенных переменных, но скрипт продолжал работать, как будто ничего не происходило.