Powershell возвращает код выхода 0 или 1 в последовательности задач MDT

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

Проблема в том, что я использую сценарий Powershell при развертывании системы Windows с помощью MDT. Сценарий вызывается последним в последовательности задач. В сценарии я прошу перезагрузить и повторить задачу, потому что приложение (инструмент обновления Dell) нуждается в перезагрузке.

Эта часть работает, так как в MDT TS он понимает, что ему нужно перезагрузиться, а также нужно перезапустить задачу. Машина перезагружается, а затем повторно запускает ту же последовательность задач, но сценарий никогда не запускается, в то время как SMSTS.log говорит, что он был успешно запущен и завершился с кодом 0.

Затем я заметил, что код выхода всегда равен 0, пока я меняю его в своем сценарии. Затем я обнаружил, что с кодом возврата моего скрипта powershell что-то не так, и попробовал следующее:

Тестовый скрипт:

$MyExitCode = 3010
Write-Host ('MyExitcode: [' + $MyExitCode + ']')
Write-Host ('LastExitCode: [' + $LastExitCode + ']')
Write-Host ''
Write-Host 'Setting MyExitCode to LastExitCode'
$LastExitCode = $MyExitCode
Write-Host 'New Result:'
Write-Host ('MyExitcode: [' + $MyExitCode + ']')
Write-Host ('LastExitCode: [' + $LastExitCode + ']')
Read-Host 'Debug Break' 
Write-Output $_
Exit $ExitCode

Откройте CMD от имени администратора, а затем выполните следующую команду

CMD> powershell.exe -ExecutionPolicy bypass -File "Z:\Applications\Test\TestRerunTask.ps1"
CMD> echo $LastExitCode
CMD> 0

Замена параметра -File на -Command изменила код выхода на 1, но все равно в SMSTS.log пишет, что вышел с кодом 0

Фрагмент SMSTS.log последовательности задач называется Test

!--------------------------------------------------------------------------------------------!  TSManager   13-2-2020 11:18:41  6200 (0x1838)
Expand a string: WinPEandFullOS                                                                 TSManager   13-2-2020 11:18:41  6200 (0x1838)
Executing command line: cscript.exe "%SCRIPTROOT%\ZTIApplications.wsf"                          TSManager   13-2-2020 11:18:41  6200 (0x1838)
Process completed with exit code 0                                                              TSManager   13-2-2020 11:19:02  6200 (0x1838)
!--------------------------------------------------------------------------------------------!  TSManager   13-2-2020 11:19:02  6200 (0x1838)
Successfully completed the action (Test) with the exit win32 code 0                             TSManager   13-2-2020 11:19:02  6200 (0x1838)
Executing in non SMS standalone mode. Ignoring send a task execution status message request     TSManager   13-2-2020 11:19:02  6200 (0x1838)
Set a global environment variable _SMSTSLastActionRetCode=0                                     TSManager   13-2-2020 11:19:02  6200 (0x1838)
Set a global environment variable _SMSTSLastActionName=Test                                     TSManager   13-2-2020 11:19:02  6200 (0x1838)
Set a global environment variable _SMSTSLastActionSucceeded=true                                TSManager   13-2-2020 11:19:02  6200 (0x1838)
Clear local default environment                                                                 TSManager   13-2-2020 11:19:02  6200 (0x1838)
The action (Test) requested a retry                                                             TSManager   13-2-2020 11:19:02  6200 (0x1838)
Created volatile registry entry for pending reboot initiated by this task sequence              TSManager   13-2-2020 11:19:02  6200 (0x1838)
The action (Test) initiated a reboot request                                                    TSManager   13-2-2020 11:19:02  6200 (0x1838)
Executing in non SMS standalone mode. Ignoring send a task execution status message request     TSManager   13-2-2020 11:19:02  6200 (0x1838)
****************************************************************************                    TSManager   13-2-2020 11:19:02  6200 (0x1838)
Execution engine result code: Reboot (2)                                                        TSManager   13-2-2020 11:19:02  6200 (0x1838)
Process completed with exit code 2147945410                                                     TSMBootstrap    13-2-2020 11:19:02  6168 (0x1818)
Exiting with return code 0x80070BC2                                                             TSMBootstrap    13-2-2020 11:19:02  6168 (0x1818)
----------------------
... More reboot stuff ...
----------------------
Expand a string: WinPEandFullOS                                                                 TSManager   13-2-2020 11:19:34  8652 (0x21CC)
Executing command line: cscript.exe "%SCRIPTROOT%\ZTIApplications.wsf"                          TSManager   13-2-2020 11:19:34  8652 (0x21CC)
Process completed with exit code 0                                                              TSManager   13-2-2020 11:19:34  8652 (0x21CC)
!--------------------------------------------------------------------------------------------!  TSManager   13-2-2020 11:19:34  8652 (0x21CC)
Successfully completed the action (Test) with the exit win32 code 0                             TSManager   13-2-2020 11:19:34  8652 (0x21CC)
Executing in non SMS standalone mode. Ignoring send a task execution status message request     TSManager   13-2-2020 11:19:34  8652 (0x21CC)
Set a global environment variable _SMSTSLastActionRetCode=0                                     TSManager   13-2-2020 11:19:34  8652 (0x21CC)
Set a global environment variable _SMSTSLastActionName=Test                                     TSManager   13-2-2020 11:19:34  8652 (0x21CC)
Set a global environment variable _SMSTSLastActionSucceeded=true                                TSManager   13-2-2020 11:19:34  8652 (0x21CC)
Clear local default environment                                                                 TSManager   13-2-2020 11:19:34  8652 (0x21CC)

person Gforse    schedule 13.02.2020    source источник
comment
$LastExitCode – это автоматическая переменная. Содержит код выхода последней запущенной программы для Windows.   -  person JosefZ    schedule 13.02.2020


Ответы (1)


После еще нескольких отладок и поиска в Google я нашел ответ, который искал. Сначала я нашел это а затем эту тему. Эти темы указали мне правильное направление. Оказывается, я запускаю сценарий Powershell как Application в последовательности задач MDT. Я считаю, что легко добавлять сценарии в качестве приложений, потому что затем я могу легко назначить их последовательности задач, НО здесь теряется магия return code. Сценарий ZTIapplications запускает сценарий powershell как powershell.exe -ExecutionPolicy bypass -Command "& { & '%deployroot%\Applications\Test\TestRerunTask.ps1'; Exit $LastExitCode }", который фиксирует код возврата, но код возврата не передается обратно в последовательность задач SMSTS, поэтому предполагается, что «Приложение» было успешно установлено. При вызове скрипта из MDT Run Powershell Script все работает как положено.

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

person Gforse    schedule 13.02.2020