Проверьте, нужна ли перезагрузка, и продолжите сценарий Powershell после перезагрузки?

Этот вопрос задавался несколько раз прежде, но я не мог найти решение моего сценария ни в одном из них.

По сути, мне нужно, чтобы скрипт продолжал работу после перезагрузки, если это необходимо. Он проверит несколько ключей реестра и определит необходимость перезагрузки компьютера.

Я пытался использовать "рабочий процесс" по-разному, но не смог заставить его работать успешно.

Вот примерное описание моего кода:

function (check-if-computer-needs-a-reboot){
    if(this and that)

    try{

    return $true
    }
    catch{}

    return $false
    }

if(check-if-computer-needs-a-reboot = $true){

Write-Host "The machine is rebooting..."
Restart-Computer -Wait -Force
Write-Host "The machine was successfully rebooted"

}

    else 

    {
    Write-Host "No pending reboot" 
    }

Надеясь на волшебников переполнения стека, может помочь.

Любая помощь будет оценена!!!

1 ответ

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

Break Разбейте ваш скрипт на две части (Preboot и Postboot). Поместите следующее в конец Preboot.ps1:

      if(check-if-computer-needs-a-reboot){
  REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Runonce" /V "Postboot" /d "\"%~dpPostboot.ps1\" MyParameters" /t REG_SZ /f
  Write-Host "The machine is rebooting..."
  Restart-Computer -Wait -Force
}
# Fall through if reboot was not needed, so continue with part 2
Write-Host "No pending reboot... continuing"
"%~dpPostboot.ps1"

Заметки:

  1. Я скопировал это из файла .bat. В файле .bat «%~dp0» означает «диск и путь, с которого выполняется текущий скрипт». Синтаксис в Powershell может немного отличаться.

  2. Хотя Powershell может запускать другие программы, такие как REG.EXE, у Powershell есть собственный встроенный HKLM: PSdrive. Это должно быть более эффективно, чем использование REG.EXE. Я оставляю это вам, чтобы сделать преобразование.

  3. В своем коде вы проверяете, "равно" ли логическое значение $True. Это сравнение никогда не требуется, если только значение не является логическим и может быть чем-то отличным от True или False. Просто проверьте само логическое значение, как показано выше.

Другие вопросы по тегам