Como agendar uma reinicialização do servidor na linha de comando no Windows 2012?

15

Gostaria de agendar uma reinicialização única do servidor, por exemplo, para concluir a instalação das atualizações de manhã cedo. Como posso fazer isso na linha de comando no Windows 2012?

No Windows 2008, eu teria usado o atcomando

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

e tirou o resto da tarde de folga.

Mas no Windows 2012, a execução desse comando me diz que

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

Portanto, o comando equivalente ao schtasks.exe pode ser

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

Além de ser muito esquecível, esse comando tem outra desvantagem importante : ele agenda a tarefa para as 2 da manhã de hoje - não adianta muito, a menos que eu esteja acordado à 1 da manhã para executá-lo.

De acordo com a ajuda do schtasks.exe, a /sdopção para definir a data de início não é aplicável /sc once. Portanto, mesmo que eu queira digitar a data de amanhã no formato mm / dd / aaaa - e não o faço - não posso fazer isso.

A única solução possível que encontrei é aqui , onde Kevin Traas sugere a criação de arquivo em lotes para criar uma tarefa agendada antes da meia-noite, que aguarda alguns minutos e, em seguida, cria outra tarefa agendada para executar o comando que você realmente deseja executar. Inteligente, mas nem de longe tão conveniente quanto at.

Luke Sampson
fonte
@Lijo esse link não contém nenhuma informação sobre como agendar uma reinicialização.
Luke Sampson
Isso é apenas estupidez total para substituir o AT por schtasks inutilizáveis. Por que eles não podiam fazer os dois? Idiotas!
midenok 6/12/18

Respostas:

13

O shutdowncomando em si possui um parâmetro de atraso /tque atrasa um desligamento por um número de segundos até 10 anos. Se você deseja agendar um desligamento em 14 horas, por exemplo, pode executar

shutdown /r /t 50400

Você também pode adicionar um motivo com o /dparâmetro ou um comentário com /c; corra shutdown /?para detalhes.

Eamon Nerbonne
fonte
9

Apesar da documentação, o /SDparâmetro parece ser compatível com o /SC ONCE. A tarefa foi criada com êxito para ser executada na data fornecida, no momento fornecido. (Testado em W8 e W7)

Além disso, a documentação do XPschtasks.exe chega ao ponto de dizer que o /SDparâmetro é necessário ao usar /SC ONCE, então imagino que haja um número razoável de scripts usando a combinação.

Exemplo:

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>

Se não concordar com a documentação, considere gerar o arquivo XML diretamente (o esquema está aqui ), que é definitivamente suportado e definitivamente suporta uma tarefa agendada para ser executada uma vez em uma data futura. Uma maneira fácil de obter o arquivo adequado é criá-lo no mmcsnap-in Agendador de tarefas e usar o comando exportar .

Exemplo:

<?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
fonte
Obrigado pela dica sobre o /sdsuporte. Também é interessante sobre a importação de XML - embora pessoalmente eu não me importe em ir contra a documentação. Portanto, pelo menos isso é possível - apenas muito, muito mais difícil do que costumava ser at.
Luke Sampson
Bastante interessante: /sdnão funciona /sc onceno Windows Server 2008. Isso resulta em:ERROR: Incorrect Start Date.
Luke Sampson
4
Hmm ... Além disso, testei o Server 2008 SP2 e o Server 2008 R2 sem problemas. Observarei que o formato da data é baseado no formato local da data / hora, e os zeros à esquerda são necessários. Na instalação padrão EN-us, isso levaria à formatação como /SD 06/14/2013.
Mitch
2

Acabei criando runat.ps1para replicar algumas das características simples de at, incorporando a sabedoria da resposta de Mitch.

A sintaxe é runat (time) (command), por exemplo,

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

Se você também é nostálgico pelos bons velhos tempos, quando não precisava digitar ...

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

... então você pode instalá-lo executando este comando 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

Ou você pode baixar manualmente o runat.ps1script aqui .

Luke Sampson
fonte
1
+1 Esse é um script muito útil ... definitivamente está entre os meus favoritos.
Mitch
1

Eu usei isso em um script para 2012 R2 e funciona bem; Ele criará uma tarefa diária que reiniciará o servidor às 4h30.

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

Certifique-se de executar isso em um prompt do CMD com privilégios administrativos.

Andy

Andy Denley
fonte
1

Apenas outro script do PowerShell para reiniciar programaticamente o computador no dia seguinte, no horário especificado

$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
fonte
0

Sugiro usar o comando schtasks com o parâmetro / f.

Usando / f, se houver uma tarefa com o mesmo nome, ela será modificada.

É muito útil para implantar tarefas via script.

Um exemplo completo de uma reinicialização do servidor de agendamento:

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
fonte
0

Se o objetivo for simplesmente reiniciar após a instalação das atualizações, você poderá usar o módulo PSWindowsUpdate para instalar as atualizações. Você pode baixá-lo aqui . Depois de instalado, basta abrir o Powershell e digite

Get-WuInstall -AcceptAll -AutoReboot
Charles Burge
fonte