我想安排一次性服务器重启,例如在清晨完成安装更新。如何在 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