如何在 Windows 2012 上从命令行安排服务器重启?

如何在 Windows 2012 上从命令行安排服务器重启?

我想安排一次性服务器重启,例如在清晨完成安装更新。如何在 Windows 2012 上从命令行执行此操作?

在 Windows 2008 上,我会使用以下at命令:

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

并休息了下午剩下的时间。

但在 Windows 2012 上,运行此命令告诉我

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

因此,与 schtasks.exe 等效的命令可能是

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

除了非常容易忘记之外,这个命令还有另一个重要的缺点:它将任务安排在凌晨 2 点今天—除非我在凌晨 1 点醒来运行它,否则没什么用。

根据 schtasks.exe 的帮助,/sd设置开始日期的开关不适用于/sc once。因此,即使我想以 mm/dd/yyyy 格式输入明天的日期(而我不想这样做),我也无法做到这一点。

我发现唯一可能的解决办法是这里,其中 Kevin Traas 建议创建批处理文件,在午夜前创建一个计划任务,等待几分钟,然后创建另一个计划任务来运行您实际想要运行的命令。很聪明,但远不如那么方便at

答案1

shutdown命令本身有一个延迟参数/t,可将关机延迟数秒,最长可达 10 年。如果你想安排在 14 小时内关机,你可以运行

shutdown /r /t 50400

您还可以添加带有参数的原因/d或带有/c;运行的注释shutdown /?以了解详细信息。

答案2

尽管有文档说明,但该/SD参数似乎与 兼容/SC ONCE。已成功创建任务,并在指定的日期和时间运行。(在 W8 和 W7 上测试)

此外,XP 文档schtasks.exe甚至说/SD使用时需要该参数/SC ONCE,因此我想有相当多的脚本使用该组合。

例子:

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>

如果您觉得违反文档不合适,可以考虑直接生成 XML 文件(模式在这里),它肯定是受支持的,并且肯定支持计划在未来某个日期运行一次的任务。获取正确文件的一个简单方法是在任务计划程序管理单元中创建它,mmc然后使用导出命令

例子:

<?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>

导入命令:

schtasks /CREATE /TN "Task Name" /XML filename.xml

答案3

我最终创造了runat.ps1复制的一些简单特征at,并融入 Mitch 回答中的智慧。

语法是runat (time) (command),例如

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

如果您也怀念那些不需要打字的美好时光......

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

...然后您可以通过运行此 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

或者您可以手动下载runat.ps1脚本这里

答案4

这只是另一个 powershell 脚本,用于在第二天的指定时间以编程方式重新启动计算机

$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

相关内容