La pregunta era interesante, así que escribí un lote que puede hacer el trabajo por usted.
Básicamente es un temporizador de cuenta regresiva, no incluí el shutdown
comando para esto, pero lo dejé como tarea. Los cálculos no son precisos, esto no se preocupa por los años bisiestos, la duración del mes, ... esto es principalmente para facilitar la lectura, ya que quería que fuera fácil de aprender.
Actualmente hay dos archivos trabajando juntos, uno inicia el temporizador y el otro, cuando se llama, indica cuánto tiempo transcurrió desde el inicio del temporizador. Estos dos archivos se pueden combinar con bastante facilidad en un script de cmd, de esta manera también puede hacer que algunas líneas sean reutilizables ( como los métodos definidos ).
Bien, echemos un vistazo a los guiones,
Aqui esta StartTimer.cmd
:
@ECHO OFF
FOR /F "skip=1 tokens=1-6" %%a IN ('wmic Path Win32_Localtime GET year^,month^,day^,hour^,minute^,second /format:TABLE ^| findstr /r "."') DO (
SET DateD=%%a
SET TimeH=%%b
SET TimeM=%%c
SET DateM=%%d
SET TimeS=%%e
SET DateY=%%f
)
SET /A EPOCH=((%DateY%-1970)*365*24*60*60)+(%DateM%*30*24*60*60)+(%DateD%*24*60*60)+(%TimeH%*60*60)+(%TimeM%*60)+%TimeS%
ECHO %EPOCH% > Timer.start.state
En línea comenzando con FOR /F "skip=1 ...
:
1. Pregunte wmic
por la hora y fecha actuales.
2. Omita la primera línea de salida, que es encabezados, en skip=1
3. Lea los valores usando el tokens=1-6
significado %%a-%%f
separado por Spaceor
TAB.
4. Almacenar los valores de las variables %DateY%
, ... %TimeH%
, %TimeM%
, ...
Después de eso, al comienzo de la línea SET /A EPOCH=...
, usamos una expresión que calcula los segundos transcurridos desde1.1.1970
( esto es simple aproximado, no un tiempo real de Unix. Vea Google si necesita información precisa ).
Luego, en la última línea ECHO %EPOCH% > ...
escribe el tiempo calculado para el archivo llamado " Timer.start.state
".
Y aqui GetTimerValue.cmd
:
@ECHO OFF
GOTO CHECKFILE
:TIMEOUT
FOR /F "skip=1 tokens=1-6" %%a IN ('wmic Path Win32_Localtime GET year^,month^,day^,hour^,minute^,second /format:TABLE ^| findstr /r "."') DO (
SET DateD=%%a
SET TimeH=%%b
SET TimeM=%%c
SET DateM=%%d
SET TimeS=%%e
SET DateY=%%f
)
SET /P Timer=<"Timer.start.state"
SET /A EPOCH=((%DateY%-1970)*365*24*60*60)+(%DateM%*30*24*60*60)+(%DateD%*24*60*60)+(%TimeH%*60*60)+(%TimeM%*60)+%TimeS%
SET /A Elapsed=%EPOCH%-%Timer%
ECHO "Seconds since timer started: %Elapsed%"
GOTO EOF
:CHECKFILE
IF EXIST "Timer.start.state" (
GOTO TIMEOUT
) ELSE (
ECHO "Timer not started. Start timer by running Timer.cmd"
)
:EOF
Aquí el flujo de código no es lineal de arriba a abajo. Primero GOTO CHECKFILE
etiquetamos para que los comandos de ejecución realmente comiencen en la línea que dice :CHECKFILE
. Muchas cosas aquí son las mismas que con, StartTimer.cmd
así que solo explico líneas nuevas o cambiadas.
Primero verificamos si Timer.start.state
existe un archivo de estado , si no, terminamos con un mensaje. Si se inició el temporizador y existen archivos, entonces continuamos y hacemos algunos cálculos:
1. Salte a :TIMEOUT
donde producimos los segundos transcurridos. Puede elegir una mejor etiqueta para eso ...
2. SET /P %Timer% ...
lee la hora de inicio del archivo y asigna el valor a la %Timer%
variable.
3. SET /A Elapsed ...
calcula segundos entre la hora de inicio y ahora.
4. ECHO "Seconds ...
repite el valor calculado (segundos desde el inicio del temporizador.
Cómo obtener el tiempo restante:
Puedes restar %Elapsed%
de %MaxTime%
:
@ECHO OFF
GetTimerValue
SET /A TimeLeft=%MaxTime%-%Elapsed%
ECHO "You have %TimeLeft% seconds remaining"
OK, explicado lo suficiente. Aquí está el guión completo Timer.cmd
:
En este punto, olvidé todo lo que ya dije. Este archivo por lotes aquí está funcionando por sí mismo, por lo que no hay por separado StartTimer.cmd
o GetTimerValue.cmd
solo esto Timer.cmd
. Básicamente sigue siendo el mismo, pero el flujo de código es diferente y el uso también es completamente diferente. Sin embargo, esto no guarda el estado en el archivo, por lo que ya no puede obtener el valor del temporizador después de cerrar sesión / reiniciar, si necesita este ejemplo anterior para guardar / leer el estado en / desde el archivo.
El uso / ayuda para Timer.cmd
se imprime cuando se ejecuta sin argumentos. No he probado completamente esto y puede haber algunos errores tipográficos, etc., los argumentos no son infalibles.
@ECHO OFF
GOTO TimerUser%1
:: ===================================
:: Operation is start, (re)start timer
:: ===================================
:TimerUserstart
ECHO %2 | FINDSTR /R "^[1-9]"
IF %ERRORLEVEL%==0 (
SET Timer.max=%2
GOTO TimerStart
) ELSE (
ECHO.
ECHO !! ERROR !!
ECHO You must specify maximum value.
ECHO ===============================
GOTO TimerUser
)
:: =============================================
:: Operation is get, get values if timer running
:: =============================================
:TimerUserget
IF DEFINED Timer.start.state (
GOTO TIMEOUT
) ELSE (
ECHO.
ECHO !! ERROR !!
ECHO Timer is not started, start timer first.
ECHO ========================================
GOTO TimerUser
)
:: ============
:: Usage / Help
:: ============
:TimerUser
ECHO.
ECHO Timer.cmd Usage: Timer.cmd operation [options]
ECHO.
ECHO - Operations
ECHO start Start new timer, n must be specified.
ECHO get Get current value of started timer.
ECHO.
ECHO - Options:
ECHO n Max value in seconds, used to calculate remaining time.
ECHO.
GOTO EOF
:: =============================
:: Update %Timer.epoch% variable
:: =============================
:TimerUpdateEpoch
FOR /F "skip=1 tokens=1-6" %%a IN ('wmic Path Win32_Localtime GET year^,month^,day^,hour^,minute^,second /format:TABLE ^| findstr /r "."') DO (
SET DateD=%%a
SET TimeH=%%b
SET TimeM=%%c
SET DateM=%%d
SET TimeS=%%e
SET DateY=%%f
)
SET /A Timer.epoch=((%DateY%-1970)*365*24*60*60)+(%DateM%*30*24*60*60)+(%DateD%*24*60*60)+(%TimeH%*60*60)+(%TimeM%*60)+%TimeS%
GOTO %Timer.Callback%
:: ===========================================
:: Start new timer destoying/resetting old one
:: ===========================================
:TimerStart
SET Timer.Callback=TimerStartC1
GOTO TimerUpdateEpoch
:TimerStartC1
SET Timer.start.state=%Timer.epoch%
GOTO EOF
:: =============================
:: Echo out current timer values
:: =============================
:TIMEOUT
SET Timer.Callback=TimerEchoJ1
GOTO TimerUpdateEpoch
:TimerEchoJ1
SET /A Timer.elapsed=%Timer.epoch%-%Timer.start.state%
SET /A Timer.remaining=%Timer.max%-%Timer.elapsed%
ECHO "Seconds since timer started: %Timer.elapsed% Time remaining %Timer.remaining%"
GOTO EOF
:EOF
Integrar con shutdown
o cualquier otro comando:
Archivo poweroff.cmd
:
@ECHO OFF
Timer start %1
shutdown -t %1 -s
Uso: poweroff <wait_seconds>
para iniciar el apagado programado y Timer get
obtener el tiempo transcurrido / restante.
/c <time>
).