2013-03-01 3 views
19

Я ищу способ продолжить сценарий Powershell, откуда он остановился после вызова перезагрузки в скрипте. Например, я создаю DC через автоматизацию Powershell, и после переименования ПК в TESTDC01 необходимо перезагрузить компьютер, но после перезагрузки продолжите работу с сценарием, чтобы перейти к dcpromo и т. Д.Powershell - перезагрузка и продолжение сценария

Возможно ли это?

Cheers!

+5

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

+0

Как я могу указать, из какой части скрипта продолжить? – PnP

+0

Поздно к вечеринке, но один из способов запускается 'script1.ps1', который перед перезагрузкой сервера добавляет ключ реестра RunOnce для запуска скрипта2.ps1, но я бы посоветовал добавить некоторый сон, чтобы позволить серверу полностью загрузиться, прежде чем пытаться запустить сценарий. – user4317867

ответ

18

В TechNet есть серия статей из серии Hey, Scripting Guy, которая описывает ситуацию, очень похожую на то, что вы описываете: переименование компьютера и возобновление сценария после перезагрузки. Магия использовать новые технологические процессы, которые являются частью 3-й версии:

workflow Rename-And-Reboot { 
    param ([string]$Name) 
    Rename-Computer -NewName $Name -Force -Passthru 
    Restart-Computer -Wait 
    Do-MoreStuff 
} 

После того, как рабочий процесс был объявлен (не присвоить его переменной), вы можете назвать это, как если бы это был обычный командлет. Настоящей магией является параметр -Wait в командлете Restart-Computer.

Rename-And-Reboot PowerShellWorkflows 

Источник: http://blogs.technet.com/b/heyscriptingguy/archive/2013/01/23/powershell-workflows-restarting-the-computer.aspx

Если PowerShell v3 или более поздней версии не доступен выбор, вы могли бы сломать существующий скрипт на несколько небольших сценариев и есть мастер-скрипт, который запускается при старте, проверяет некоторое сохраненное состояние где-нибудь (файл, реестр и т. д.), затем начинает выполнение нового скрипта, чтобы продолжить, где это необходимо. Что-то вроде:

$state = Get-MyCoolPersistedState 
switch ($state) { 
    "Stage1" { . \Path\To\Stage1.ps1 ; break } 
    "Stage2" { . \Path\To\Stage2.ps1 ; break } 
    "Stage3" { . \Path\To\Stage3.ps1 ; break } 
    default { "Uh, something unexpected happened" } 
} 

Просто не забудьте запомнить свое состояние надлежащим образом при перемещении по вашим маленьким сценариям.

+2

Когда я пытаюсь использовать «Restart-Computer -Wait», я получаю исключение: «Не могу дождаться перезагрузки локального компьютера.Локальный компьютер игнорируется, когда задан параметр Wait. » – BrainSlugs83

+0

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

5

Проверьте PS 3.0 с рабочими процессами. Я еще не работал с ними, но они полагаются на восстановление после перезапуска.

10

Вышеприведенный ответ верен, но он применим только к удаленному исполнению сценариев powershell. Согласно windows web portal, так, чтобы ваш локально работает скрипт резюме, из которого она была прервана после того, как локальная машина перезапущена, как так:

workflow Resume_Workflow 
{ 
    ..... 
    Rename-Computer -NewName some_name -Force -Passthru 
    Restart-Computer -Wait 
    # Do some stuff 
    ..... 
} 
# Create the scheduled job properties 
$options = New-ScheduledJobOption -RunElevated -ContinueIfGoingOnBattery -StartIfOnBattery 
$secpasswd = ConvertTo-SecureString "Aa123456!" -AsPlainText -Force 
$credential = New-Object System.Management.Automation.PSCredential ("WELCOME\Administrator", $secpasswd) 
$AtStartup = New-JobTrigger -AtStartup 

# Register the scheduled job 
Register-ScheduledJob -Name Resume_Workflow_Job -Trigger $AtStartup -ScriptBlock ({[System.Management.Automation.Remoting.PSSessionConfigurationData]::IsServerManager = $true; Import-Module PSWorkflow; Resume-Job -Name new_resume_workflow_job -Wait}) -ScheduledJobOption $options 
# Execute the workflow as a new job 
Resume_Workflow -AsJob -JobName new_resume_workflow_job 

Обратите внимание, что [System.Management.Automation.Remoting.PSSessionConfigurationData]::IsServerManager флаг должен быть установлен верно, только если рабочий действия должны выполняться локально после перезапуска.

+1

Что такое учетные данные? Я тестировал ваш сценарий, и я вижу, что созданное задание, но оно находится в состоянии приостановлено после перезагрузки: Get-Job | Format-Table - Авто размер – codea

0

Если это кому-то помогает, то я перезагружаю сервер, а затем цикл до тех пор, пока \\server\c$ не будет отключен. Затем я петлю While (-not(Test-path "\\$server\c$")), чтобы подтвердить, что сервер снова подключен к сети и просто продолжает мой скрипт.

Этот код работает, но определенно может быть улучшен. Он генерирует журнал CSV для перезагружаемых серверов. Он также должен работать в PowerShell v2 и новее.

Param([Parameter(Mandatory=$true)][string]$server) 
$ErrorActionPreference = "SilentlyContinue" 

Try{ 
$LastReboot = Get-EventLog -ComputerName $server -LogName system | Where-Object {$_.EventID -eq '6005'} | Select -ExpandProperty TimeGenerated | select -first 1 

(Invoke-WmiMethod -ComputerName $server -Path "Win32_Service.Name='HealthService'" -Name PauseService).ReturnValue | Out-Null 

Restart-Computer -ComputerName $server -Force 

#New loop with counter, exit script if server did not reboot. 
$max = 20;$i = 0 
DO{ 
IF($i -gt $max){ 
     $hash = @{ 
      "Server" = $server 
      "Status" = "FailedToReboot!" 
      "LastRebootTime" = "$LastReboot" 
      "CurrentRebootTime" = "FailedToReboot!" 
      } 
$newRow = New-Object PsObject -Property $hash 
$rnd = Get-Random -Minimum 5 -Maximum 40 
Start-Sleep -Seconds $rnd 
Export-Csv D:\RebootResults.csv -InputObject $newrow -Append -Force 
    "Failed to reboot $server" 
    exit}#exit script and log failed to reboot. 
    $i++ 
"Wait for server to reboot" 
    Start-Sleep -Seconds 15 
}#end DO 
While (Test-path "\\$server\c$") 

$max = 20;$i = 0 
DO{ 
IF($i -gt $max){ 
     $hash = @{ 
      "Server" = $server 
      "Status" = "FailedToComeOnline!" 
      "LastRebootTime" = "$LastReboot" 
      "CurrentRebootTime" = "FailedToReboot!" 
      } 
$newRow = New-Object PsObject -Property $hash 
$rnd = Get-Random -Minimum 5 -Maximum 40 
Start-Sleep -Seconds $rnd 
Export-Csv D:\RebootResults.csv -InputObject $newrow -Append -Force 
    "$server did not come online" 
    exit}#exit script and log failed to come online. 
    $i++ 
    "Wait for [$server] to come online" 
    Start-Sleep -Seconds 15 
}#end DO 
While (-not(Test-path "\\$server\c$")) 

$CurrentReboot = Get-EventLog -ComputerName $server -LogName system | Where-Object {$_.EventID -eq '6005'} | Select -ExpandProperty TimeGenerated | select -first 1 
    $hash = @{ 
      "Server" = $server 
      "Status" = "RebootSuccessful" 
      "LastRebootTime" = $LastReboot 
      "CurrentRebootTime" = "$CurrentReboot" 
       } 

$newRow = New-Object PsObject -Property $hash 
$rnd = Get-Random -Minimum 5 -Maximum 40 
Start-Sleep -Seconds $rnd 
Export-Csv D:\RebootResults.csv -InputObject $newrow -Append -Force 

}#End Try. 

Catch{ 
$errMsg = $_.Exception 
"Failed with $errMsg" 
} 
Смежные вопросы