Solución:
Hay un gran artículo en TechNet de la serie Hey, Scripting Guy que repasa una situación muy similar a la que está describiendo: Cambiar el nombre de una computadora y reanudar la secuencia de comandos después de reiniciar. La magia es utilizar los nuevos flujos de trabajo que forman parte de la versión 3:
workflow Rename-And-Reboot {
param ([string]$Name)
Rename-Computer -NewName $Name -Force -Passthru
Restart-Computer -Wait
Do-MoreStuff
}
Una vez que se ha declarado el flujo de trabajo (no lo asigna a una variable), puede llamarlo como si fuera un cmdlet normal. La verdadera magia es la -Wait
en el cmdlet Restart-Computer.
Rename-And-Reboot PowerShellWorkflows
Fuente: https://devblogs.microsoft.com/scripting/powershell-workflows-restarting-the-computer/
Si PowerShell v3 o posterior no es una opción disponible, puede dividir su secuencia de comandos existente en varias secuencias de comandos más pequeñas y tener una secuencia de comandos maestra que se ejecuta al inicio, verifica algún estado guardado en alguna parte (archivo, registro, etc.), luego comienza a ejecutar un nuevo script para continuar donde sea apropiado. Algo como:
$state = Get-MyCoolPersistedState
switch ($state) {
"Stage1" { . PathToStage1.ps1 ; break }
"Stage2" { . PathToStage2.ps1 ; break }
"Stage3" { . PathToStage3.ps1 ; break }
default { "Uh, something unexpected happened" }
}
Solo asegúrese de recordar configurar su estado de manera adecuada a medida que avanza en sus guiones más pequeños.
La respuesta anterior es cierta, pero solo se aplicará a la ejecución remota de scripts de PowerShell. Según el portal web de Windows, la forma de reanudar el script que se ejecuta localmente desde donde lo dejó después de reiniciar la máquina local es así:
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 ("WELCOMEAdministrator", $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
Tenga en cuenta que el [System.Management.Automation.Remoting.PSSessionConfigurationData]::IsServerManager
El indicador debe establecerse en verdadero solo si las acciones del flujo de trabajo están destinadas a ejecutarse localmente después del reinicio.
Eche un vistazo a PS 3.0 con flujos de trabajo. No he trabajado con ellos todavía, pero se supone que se recuperarán de los reinicios.