¿Hay alguna manera de ver cuánto tiempo queda antes de un apagado programado en Windows 7?
Por apagado programado me refiero a un apagado (o reinicio) programado usando la shutdown.exe
aplicación de línea de comando , por ejemplo:
shutdown /t 600 /s
Aparecería un cuadro de mensaje que indica que faltan 10 minutos para el apagado y la hora real de apagado del sistema.
En cualquier momento más largo que 600
segundos se usa un mensaje de globo en su lugar.
Recuerdo vagamente que XP proporcionaba un monitor de progreso de la GUI, con una cuenta regresiva.
¿Cómo funcionaron? El tiempo de apagado restante o el tiempo programado deben almacenarse en algún lugar, ¿cómo puedo acceder a esto?
Mi preferencia es algún método a través de la línea de comando (es decir, no GUI). Más importante aún, ¿esto se puede lograr en Windows, es decir, sin ningún programa de terceros?
Si esto no se puede lograr con las utilidades estándar de Windows (y estoy limitando con el territorio de Stack Overflow aquí), ¿hay una API de Windows (o .NET, que incluso podría usarse en PowerShell)? Cualquiera de los dos sería preferible a algún programa de terceros aleatorio.
/c <time>
).Respuestas:
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
: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
: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%
: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
oGetTimerValue.cmd
solo estoTimer.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.Integrar con
shutdown
o cualquier otro comando:Archivo
poweroff.cmd
:Uso:
poweroff <wait_seconds>
para iniciar el apagado programado yTimer get
obtener el tiempo transcurrido / restante.fuente
StartTimer.cmd
debe llamarse explícitamente. Había escrito un pequeño programa para resolver mi problema, que publicaré cuando vuelva a mi computadora.shutdown.exe
, que llamóshutdown_original.exe
. Comprobaría la/t
marca y, si existiera, crearía un archivo con las horas de inicio y finalización guardadas. Al recuperar los tiempos (/retrieve
marca), verificaría el registro de eventos para ver si se realizó un inicio o un aborto desde que comenzó el temporizador. No estoy seguro de cómo habría manejado las hibernaciones. No voy a publicar el código o el programa: es un desastre. Y para que el programa funcionara, tuve que jugar mucho con la configuración de seguridad, que no quiero promover.shutdown.exe
llamada y registrar los tiempos en un archivo, que fue lo que hizo y por qué estoy aceptando esto.