Saltar al contenido

Powershell – Reiniciar y continuar secuencia de comandos

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *