if-statement batch-file timer shutdown restart

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.