¿Cómo puedo programar un reinicio del servidor desde la línea de comandos en Windows 2012?

15

Me gustaría programar un reinicio del servidor por única vez, por ejemplo, para terminar de instalar las actualizaciones temprano en la mañana. ¿Cómo puedo hacer esto desde la línea de comandos en Windows 2012?

En Windows 2008, hubiera usado el atcomando,

at 2am shutdown -r -f -c "restart"

y tomé el resto de la tarde libre.

Pero en Windows 2012, ejecutar este comando me dice que

The AT command has been deprecated. Please use schtasks.exe instead.

Entonces, el comando equivalente con schtasks.exe podría ser

schtasks /create /sc once /tn restart /tr "shutdown - r -f ""restart""" /st 02:00

Además de ser muy olvidable, este comando tiene otro inconveniente importante : programa la tarea para las 2 de la mañana de hoy; no sirve de mucho a menos que esté despierto a la 1 de la mañana para ejecutarlo.

Según la ayuda de schtasks.exe, el modificador /sdpara configurar la fecha de inicio no es aplicable con /sc once. Entonces, incluso si quisiera escribir la fecha de mañana en formato mm / dd / aaaa, y no lo hago, no puedo hacer esto.

La única solución posible que he encontrado es aquí , donde Kevin Traas sugiere crear un archivo por lotes para crear una tarea programada justo antes de la medianoche que espere un par de minutos y luego cree otra tarea programada para ejecutar el comando que realmente desea ejecutar. Inteligente, pero de ninguna manera tan conveniente como at.

Luke Sampson
fuente
@Lijo ese enlace no contiene ninguna información sobre cómo programar un reinicio.
Luke Sampson
Esto es solo una estupidez total para reemplazar AT con schtasks inutilizables. ¿Por qué no podían hacer los dos? Jerks!
midenok

Respuestas:

13

El shutdowncomando en sí tiene un parámetro de retraso /tque retrasa el apagado durante varios segundos hasta 10 años. Por ejemplo, si desea programar un apagado en 14 horas, puede ejecutar

shutdown /r /t 50400

También puede agregar un motivo con el /dparámetro o un comentario con /c; corre shutdown /?por detalles.

Eamon Nerbonne
fuente
9

A pesar de la documentación, el /SDparámetro parece ser compatible con el /SC ONCE. La tarea se creó correctamente para ejecutarse en la fecha indicada, a la hora indicada. (Probado en W8 y W7)

Además, la documentación de XPschtasks.exe va tan lejos como para decir /SDque se requiere el parámetro cuando se usa /SC ONCE, así que imagino que hay una buena cantidad de scripts que usan la combinación.

Ejemplo:

C:\Users\Mitch>schtasks /create /sc once /tn restart /tr "shutdown -r -f ""restart""" /st 23:00 /sd 2013-06-13
SUCCESS: The scheduled task "restart" has successfully been created.

C:\Users\Mitch>

Si ir en contra de la documentación no le sienta bien, considere generar el archivo XML directamente (el esquema está aquí ), que definitivamente es compatible y definitivamente es compatible con una tarea programada para ejecutarse una vez en una fecha futura. Una manera fácil de obtener el archivo adecuado es crearlo en el mmccomplemento Programador de tareas y usar el comando de exportación .

Ejemplo:

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2013-06-12T21:20:51.004181</Date>
    <Author>FOOBAR\Mitch</Author>
  </RegistrationInfo>
  <Triggers>
    <TimeTrigger>
      <StartBoundary>2013-06-13T22:20:29</StartBoundary>
      <Enabled>true</Enabled>
    </TimeTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>FOOBAR\Mitch</UserId>
      <LogonType>InteractiveToken</LogonType>
      <RunLevel>LeastPrivilege</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>P3D</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>Your command here</Command>
    </Exec>
  </Actions>
</Task>

Comando para importar:

schtasks /CREATE /TN "Task Name" /XML filename.xml
Mitch
fuente
Gracias por el consejo sobre /sdser apoyado. Eso también es interesante sobre la importación de XML, aunque personalmente no me importa ir en contra de la documentación. Entonces, al menos esto es posible, solo mucho, mucho más difícil de lo que solía ser at.
Luke Sampson
Mildy interesante: /sdno funciona con /sc onceWindows Server 2008. Resulta enERROR: Incorrect Start Date.
Luke Sampson
44
Hmm ... además probé Server 2008 SP2 y Server 2008 R2 sin problemas. Notaré que el formato de fecha se basa en su formato de fecha / hora local, y se requieren ceros iniciales. En la instalación predeterminada de EN-us, esto llevaría a formatear como /SD 06/14/2013.
Mitch
2

Terminé creando runat.ps1para replicar algunas de las características simples de at, incorporando la sabiduría de la respuesta de Mitch.

La sintaxis es runat (time) (command), por ejemplo

runat 2am shutdown -r -f -c "restarting the server"
runat 10:15 msg * it`'s 10:15 everyone!

Si usted también siente nostalgia por los viejos tiempos en los que no tenía que escribir ...

schtasks /create /ru system /rl highest /sc once /tn restart /tr shutdown -r -f -c \"restarting the server\" /st 02:00 /sd 06/15/2013

... entonces puede instalarlo ejecutando este comando de PowerShell:

iex (new-object net.webclient).downloadstring('https://gist.github.com/lukesampson/5779205/raw/install.ps1');install runat https://gist.github.com/lukesampson/5778559/raw

O puede descargar manualmente el runat.ps1script aquí .

Luke Sampson
fuente
1
+1 Ese es un script muy útil ... esto definitivamente va en mis favoritos.
Mitch
1

Usé esto en un script para 2012 R2 y funciona bien; Creará una tarea diaria que reinicia el servidor a las 4:30 a.m.

schtasks /create /ru system /rl highest /sc DAILY /tn restart /tr "shutdown /r /f /c "Restarting" /st 04:30

Asegúrese de ejecutar esto desde un indicador de CMD con privilegios administrativos.

Andy

Andy Denley
fuente
1

Solo otro script de PowerShell para reiniciar programáticamente la computadora al día siguiente a la hora especificada

$tomorrowDate = (get-date).AddDays(1).ToString("dd/mm/yyyy")

schtasks /delete /tn restart /f
schtasks /create /sc once /ru MyDomain\administrator /rp /tn restart /tr "shutdown -r -f" /st 07:13 /sd $tomorrowDate
Marc Cals
fuente
0

Sugiero usar el comando schtasks con el parámetro / f.

Usando / f, si hay una tarea con el mismo nombre, se modifica.

Es muy útil para implementar tareas mediante secuencias de comandos.

Un ejemplo completo de reinicio del servidor de programación:

schtasks /create /ru system /rl highest /sc DAILY /tn Reinicio /tr "shutdown /r /f /t 0 /c "Reinicio"" /st 22:30 /F

Extraído de: http://www.sysadmit.com/2016/09/windows-programar-apagado-o-reinicio-automatico.html

Manuel Gómez
fuente
0

Si el objetivo es simplemente reiniciar después de instalar las actualizaciones, puede usar el módulo PSWindowsUpdate para instalar las actualizaciones. Puedes descargarlo desde aquí . Una vez instalado, solo abra Powershell y escriba

Get-WuInstall -AcceptAll -AutoReboot
Charles Burge
fuente