Правильный код выхода RunSynchronousCommand для сбоя автоматической установки?
Я использую файл autounattend.xml для автоматической установки Windows Server 2022.
вspecialize
У меня есть несколько сценариев Powershell, которые я хочу запустить (определенных вRunSynchronousCommand
элементы).
Мне нужно убедиться, что в случае сбоя одного из этих сценариев весь процесс установки будет немедленно прерван. Я ожидал, что неперехваченное исключение сделает именно это, но, к моему большому удивлению, этого не произошло. Он просто проходит следующий шаг.
Как я могу гарантировать, что установка Windows будет прерываться при сбое моего пользовательского сценария? Я должен выйти с каким-то специальным кодом?
1 ответ
Per если вы используете и код возврата не0-2
затем « Команда не выполнена. Должна быть возвращена ошибка и установка прервана » .
Видимо, это работает с обоими"specialize
" и "auditUser
«. Если это определено и настроено правильно, это должно прервать установку, как указано в этой опции.
Если значение
WillReboot
являетсяOnRequest
, синхронная команда должна вернуть один из следующих кодов.
- Код возврата:
- Описание: Команда выполнена успешно. Перезагрузка не требуется.
- Код возврата:
- Описание: Команда выполнена успешно. Требуется немедленная перезагрузка. Затем можно запустить следующую команду.
- Код возврата:
2
- Описание: Команда все еще выполняется. Требуется немедленная перезагрузка. Затем ту же команду необходимо перезапустить. Этот код можно возвращать несколько раз.
- Код возврата:
<anything else>
- Описание: Команда не выполнена. Должна быть возвращена ошибка и установка прервана.
Другая полезная деталь
Я бы еще добавил, что команда внутри
Path
элемент, который вызываетpowershell.exe scriptfile.ps1
может в конечном итоге абстрагироваться от кодов выхода из файла сценария. В моем случае, хотя сценарий заканчивается выходом10
, Концовка%errorlevel%
ценность все еще была1
, как в «Powershell не вышел с0
". Чтобы обойти эту проблему, я изменил команду на'powershell -command "& ./scriptfile.ps1;exit $LASTEXITCODE;"'
. – Crono
Исключения
Более того, для перехвата необработанных исключений (или их запуска) в большинстве случаев я считаю, что Например$e=try{<logic>}Catch{$False}; If(!$e){$FreakOut=$True}
или какой-либо вариант как таковой, помогающий запустить его, если в процессе выполнения не происходит иного.
Если все остальное не помогло и вам нужно зафиксировать все, что вы не видите на выходе во время выполнения, включите и проверьте его журнал после устранения неполадок при выполнении.