8

所以我试图在 set 命令下的一个 if 语句中添加一个计时器,但我不确定该命令是什么。该脚本将启动并等待三十分钟,然后重新启动 PC 或等待用户输入以在那时输入或取消它。所以我设置了“立即重启”和“取消”的两个 if 语句,但现在我需要一个 if 语句让它从执行我的重启命令前的 30 分钟开始倒计时。此外,如果有人知道如何在那里添加一个可视计时器,显示还剩多少时间,那将是一个加号。多谢你们!!!

@Echo off

:START

set /p answer=PC WILL RESTART IN 30 MINUTES, PRESS N TO RESTART NOW OR C TO CANCEL

if "%answer%"=="n" (GOTO Label1)
if "%answer%"=="c" (GOTO Label2)
if "TIMER GOES HERE" "==" (GOTO Label1)

:Label1

shutdown -r -t 60 -f

:Label2 

exit
4

5 回答 5

11

我建议使用CHOICE.EXE,它是大多数 Windows 版本的标准配置(Windows NT、2000 和 XP 除外,它曾经可以从 Microsoft 的网站下载,但他们似乎在他们的 ftp 网站上忽略了这个*。)并且是使用简单。

@Echo off
:START
set waitMins=30

echo PC WILL RESTART IN %waitMins% MINUTES: Press N to restart [N]ow or C to [C]ancel
:: Calculate Seconds
set /a waitMins=waitMins*60
:: Choices are n and c, default choice is n, timeout = 1800 seconds
choice /c nc /d n /t %waitMins%

:: [N]ow = 1; [C]ancel = 2
goto Label%errorlevel%

:Label1

shutdown -r -t 60 -f
:: Make sure that the process doesn't fall through to Lable2
goto :eof

:Label2 
exit

就像CHOICE.EXE这样工作......

choice

……和……一样

choice /c yn

...两者都将显示...

[Y,N]?

...并且两者都将等待用户按 aYN

Choice 将结果存储在 %errorlevel% 中。Y=1,N=2。

我提供的代码利用了默认/D <choice>和超时/T <seconds>选项。

例如...

choice /c yn /d y /t 5

...让用户选择 Y 或 N,等待 5 秒然后自动选择默认选项 Y,导致 %ERRORLEVEL%==1。

另一个例子是……

choice /c abcdef /m "Make a choice. "

...它显示...

Make a choice. [A,B,C,D,E,F]? 

...和...

A = %ERRORLEVEL% = 1
B = %ERRORLEVEL% = 2
C = %ERRORLEVEL% = 3
D = %ERRORLEVEL% = 4
E = %ERRORLEVEL% = 5
F = %ERRORLEVEL% = 6

没有错误级别 0。

有关使用的更多信息choice,请CHOICE /?在命令提示符处键入。


*注意I的版本CHOICE.EXE提供了一个使用略有不同的命令的链接,但提供了相同的功能。

于 2012-09-08T20:38:04.670 回答
8

类似的休眠。

@echo off
setlocal enableDelayedExpansion
for /l %%N in (600 -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 "HIBERNATE in !min!:!sec! - Press N to hibernate Now, or C to Cancel. " /t:1 /d:1
  if not errorlevel 3 goto :break
)
cls
echo HIBERNATE in 0:00 - Press N to hibernate Now, or C to Cancel.
:break
if errorlevel 2 (%windir%\System32\rundll32.exe powrprof.dll,SetSuspendState Hibernate) else echo Hibernate Canceled
于 2012-10-08T19:06:02.210 回答
2

这是一个非常简单的 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 解决方案,但这需要做更多的工作,而且我对这项技术知之甚少。

于 2012-09-08T17:43:05.873 回答
0

我将使用此代码使脚本暂停指定的毫秒数:

PING 1.1.1.1 -n 1 -w <milliseconds> >NUL 

这将在过去1.1.1.1后向 IP 地址发送 1 个 ping 。<milliseconds>并且ping命令的输出将被忽略为 NUL。

于 2012-09-08T14:12:23.017 回答
0

我通过 SPC_75 推荐这个脚本,它是一个 .vbs 文件,并且用于休眠,但它很容易修改为休眠或关机。

'//*******************************************
'//hibernate.vbs
'//Purpose: Count Down to action (Hibernate)
'//Tested on Server 2008, Win 7 64bit, and XP
'//Author: SPC_75 
'//Revision 1.3
'//Date: 1/09/2011
'//*******************************************

Option Explicit
Dim timeout, objShell, intReturn
Const wshOk = 1
Const wshOkDialog = 0
'Const wshIcon = 16 '/critical
'Const wshIcon = 32 '/question
Const wshIcon = 48 '/exclamation
'Const wshIcon = 64 '/information

timeout = 30 '/Timeout in seconds

Set objShell = CreateObject("Wscript.Shell")
  Do Until timeout = 0
    timeout = timeout - 1
    intReturn = objShell.Popup(vbCrlf &"Hibernation about to initiate. Abort?"&vbCrlf & vbCrlf & vbCrlf & vbCrlf & "Time until hibernation : " & timeout, 1, "Hibernation", wshOkDialog + wshIcon + 4096)
    If intReturn = wshOk Then
        Wscript.Quit
    End If
  loop
  objShell.Run "powercfg /hibernate on"
  objShell.Run "shutdown -h"
  objShell.Run "rundll32 powrprof.dll,SetSuspendState Hibernate"  '/XP specific Hibernation command
set objShell = nothing

'//EOF

与警告和超时完美配合。

于 2016-09-13T04:10:21.673 回答