if-statement - shutdown windows xp cmd
Cómo solicitar la entrada del usuario del archivo por lotes con un tiempo de espera (5)
Así que estoy tratando de agregar un temporizador a una de mis sentencias if bajo un comando set, pero no estoy seguro de cuál será el comando. La secuencia de comandos se iniciará y esperará treinta minutos antes de reiniciar la PC o esperar que la entrada de un usuario la ingrese en ese momento o cancelarla. Así que tengo mis dos sentencias if para los conjuntos "reiniciar ahora" y "cancelar", pero ahora necesito una instrucción if para tener una cuenta regresiva de treinta minutos antes de que ejecute mi comando de reinicio. Además, si alguien sabe cómo agregar un temporizador visual allí que muestra cuánto tiempo queda, eso sería un plus. ¡¡¡Gracias chicos!!!
@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
Aquí hay una solución realmente simple para Vista y Windows 7 que proporciona la función de tiempo de espera, pero no da una cuenta regresiva visual.
@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
Aquí hay una solución más compleja para Vista y Windows 7 que proporciona una cuenta atrás visual, pero borra la ventana de la consola cada segundo. También el tiempo es probablemente un poco apagado.
@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
Si necesita una solución de XP, entonces creo que deberá descargar una herramienta de línea de comando no nativa que solicite entrada con una función de tiempo de espera, o cambie a VBScript o JScript.
EDITAR
Ambos scripts anteriores se pueden adaptar para ejecutarse en XP utilizando la descarga CHOICE.EXE del sitio FTP de Microsoft que James K proporcionó en su respuesta.
Esa versión de CHOICE tiene una sintaxis ligeramente diferente.
Para adaptar mi primer script, use:
choice /c:CN /n /t:N,1800 "PC will restart in 30 minutes. Press N to restart Now, or C to Cancel"
Para adaptar mi segundo script, use:
choice /c:CN1 /n /t:1,1 "PC will restart in !min!:!sec! - Press N to restart Now, or C to Cancel. "
EDITAR - Aquí hay una solución VBS cruda que es compatible con XP
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"
Creo que puede proporcionar una solución de VBS más elegante utilizando HTA, pero eso es mucho más trabajo, y realmente no sé mucho sobre esa tecnología.
Recomiendo esta secuencia de comandos por SPC_75 es un archivo .vbs sin embargo, y para hibernación, pero es fácil de modificar para dormir o apagar.
''//*******************************************
''//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
Funciona perfectamente con una advertencia y tiempo de espera.
Recomiendo usar CHOICE.EXE
, viene de serie con la mayoría de las versiones de Windows (con la excepción de Windows NT, 2000 y XP, solía descargarse desde el sitio web de Microsoft, pero parecen haber pasado por alto este * uno en su sitio ftp). ) y es simple de usar.
@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
Simplemente CHOICE.EXE
funciona así ...
choice
... y es lo mismo que ...
choice /c yn
... ambos se mostrarán ...
[Y,N]?
... y ambos esperarán a que el usuario presione Y
o N
La opción almacena el resultado en% errorlevel%. Y = 1, N = 2.
El código que proporcioné aprovecha las /D <choice>
predeterminadas /D <choice>
y tiempo de espera /T <seconds>
.
Por ejemplo...
choice /c yn /d y /t 5
... le da al usuario la opción de Y o N, esperará durante 5 segundos y luego seleccionará automáticamente la opción predeterminada de Y, lo que dará como resultado% ERRORLEVEL% == 1.
Otro ejemplo es ...
choice /c abcdef /m "Make a choice. "
... y muestra ...
Make a choice. [A,B,C,D,E,F]?
...y...
A = %ERRORLEVEL% = 1
B = %ERRORLEVEL% = 2
C = %ERRORLEVEL% = 3
D = %ERRORLEVEL% = 4
E = %ERRORLEVEL% = 5
F = %ERRORLEVEL% = 6
No hay ERRORLEVEL 0.
Para obtener más información sobre el uso de la choice
, escriba CHOICE /?
en el símbolo del sistema.
* NOTA La versión de CHOICE.EXE
que proporcioné un enlace usa comandos ligeramente diferentes, pero proporciona la misma funcionalidad.
Similar para hibernar.
@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
Utilizaría este código para hacer que el script se detenga durante un número específico de milisegundos:
PING 1.1.1.1 -n 1 -w <milliseconds> >NUL
Esto enviará 1 ping a la dirección IP 1.1.1.1
después de que haya transcurrido <milliseconds>
. Y la salida del comando ping
será descartada a NUL.