这是一个非常简单的 Vista 和 Windows 7 解决方案,它提供了超时功能,但不提供视觉倒计时。
@echo off
choice /c:CN /n /m "PC will restart in 30 minutes. Press N to restart Now, or C to Cancel" /t:1800 /d:N
if errorlevel 2 (shutdown -r -t 60 -f) else echo Restart Canceled
这是一个针对 Vista 和 Windows 7 的更复杂的解决方案,它提供了视觉倒计时,但它每秒都会清除控制台窗口。另外,时间可能有点不对。
@echo off
setlocal enableDelayedExpansion
for /l %%N in (1800 -1 1) do (
set /a "min=%%N/60, sec=%%N%%60, n-=1"
if !sec! lss 10 set sec=0!sec!
cls
choice /c:CN1 /n /m "PC will restart in !min!:!sec! - Press N to restart Now, or C to Cancel. " /t:1 /d:1
if not errorlevel 3 goto :break
)
cls
echo PC will restart in 0:00 - Press N to restart Now, or C to Cancel.
:break
if errorlevel 2 (shutdown -r -t 60 -f) else echo Restart Canceled
如果您需要 XP 解决方案,那么我认为您需要下载一个非本地命令行工具,该工具要求输入具有超时功能,或者切换到 VBScript 或 JScript。
编辑
通过使用James K 在其回答中提供的 Microsoft FTP 站点下载的 CHOICE.EXE,可以调整上述两个脚本以在 XP 上运行。
该版本的 CHOICE 语法略有不同。
要改编我的第一个脚本,请使用:
choice /c:CN /n /t:N,1800 "PC will restart in 30 minutes. Press N to restart Now, or C to Cancel"
要调整我的第二个脚本,请使用:
choice /c:CN1 /n /t:1,1 "PC will restart in !min!:!sec! - Press N to restart Now, or C to Cancel. "
编辑 - 这是与 XP 兼容的粗略 VBS 解决方案
Set objShell = CreateObject("WScript.Shell")
for i = 30 to 1 step -1
if i=1 then unit=" minute" else unit=" minutes"
rtn = objShell.Popup ( _
"The machine would like to Restart."&VbCrLf&VbCrLf& _
"Click OK to restart now"&VbCrLf& _
"Click Cancel or the [X] close button to abort the restart"&VbCrLf& _
"Do nothing and the machine will restart in "&i&unit, _
60, "Restart in "&i&unit, 1+48 _
)
if rtn <> -1 then exit for
next
if rtn <> 2 then objShell.Run "shutdown -r -f"
我认为您可以使用 HTA 提供更优雅的 VBS 解决方案,但这需要做更多的工作,而且我对这项技术知之甚少。