Temps restant avant l'arrêt programmé?

8

Existe-t-il un moyen de voir combien de temps il reste avant un arrêt planifié dans Windows 7?

Par arrêt planifié, j'entends un arrêt (ou redémarrage) planifié à l'aide de l' shutdown.exeapplication en ligne de commande , par exemple:

shutdown /t 600 /s

Cela afficherait une boîte de message indiquant qu'il y a 10 minutes avant l'arrêt, et l'heure réelle de l'arrêt du système.

Tout temps supérieur à 600quelques secondes utilise à la place un message ballon.

Je me souviens vaguement que XP avait fourni un moniteur de progression de l'interface graphique, avec un compte à rebours.

Comment ont-ils fonctionné? Le temps d'arrêt restant ou le temps planifié doivent être stockés quelque part, comment puis-je y accéder?

Ma préférence est une méthode via la ligne de commande (c'est-à-dire non GUI). Plus important encore, est-ce réalisable sous Windows, c'est-à-dire sans aucun programme tiers?

Si cela n'est pas réalisable avec les utilitaires Windows standard (et je suis à la limite du territoire Stack Overflow ici), existe-t-il une fonction Windows API (ou .NET, qui pourrait même être utilisée dans PowerShell!)? L'un ou l'autre serait préféré à un programme tiers aléatoire.

Bob
la source
superuser.com/a/317062/117590 semblait prometteur, cependant, il est préférable / obligatoire que la commande d'arrêt ne soit pas modifiée comme l'ajout d'un commentaire ( /c <time>).
Bob
Je pense qu'un fichier batch ne serait pas difficile à écrire .. Demander l'heure, et toutes les 5 minutes environ il pourrait répondre avec un temps, IE "10 minutes restantes" .. secondes ou quelque chose.
cutrightjm
Je n'ai pas besoin de compte à rebours, j'ai besoin d'une méthode pour obtenir le temps restant à ce moment. La commande d'arrêt est appelée par un programme externe.
Bob

Réponses:

5

La question était intéressante, j'ai donc écrit un lot qui peut faire du travail pour vous.

Fondamentalement, c'est le compte à rebours, je n'ai pas inclus de shutdowncommande mais je l'ai laissé comme devoir. Les calculs ne sont pas précis, cela ne se soucie pas des années bissextiles, de la durée du mois, ... c'est principalement pour la lisibilité car je voulais le garder facile à apprendre.

Il y a actuellement deux fichiers qui travaillent ensemble, l'un démarre le minuteur et l'autre, lorsqu'il est appelé, indique le temps écoulé depuis le démarrage du minuteur. Ces deux fichiers peuvent être combinés assez facilement en un seul script cmd, de cette façon, vous pouvez également rendre certaines lignes réutilisables ( comme les méthodes définies ).

D'accord, jetons un œil aux scripts,

Voici 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 ligne commençant par FOR /F "skip=1 ...:
1. Demandez wmicl'heure et la date actuelles.
2. Ignorez la première ligne de sortie, qui est les en-têtes, de skip=1
3. Lisez les valeurs en utilisant la tokens=1-6signification %%a-%%fséparée par SpaceorTAB.
4. valeurs magasin aux variables %DateY%, ... %TimeH%, %TimeM%...

Après cela, au début de la ligne, SET /A EPOCH=...nous utilisons une expression qui calcule les secondes écoulées1.1.1970 ( c'est une approximation simple, pas un temps Unix réel. Voir Google si vous avez besoin de précision ).

Puis à la dernière ligne ECHO %EPOCH% > ...écrit le temps calculé dans le fichier appelé " Timer.start.state".

Et ici 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

Ici, le flux de code n'est pas linéaire de haut en bas. D'abord, nous GOTO CHECKFILEétiquetons donc les commandes d'exécution commencent vraiment à la ligne qui dit :CHECKFILE. Beaucoup de choses ici sont les mêmes que pour StartTimer.cmddonc j'explique seulement les lignes nouvelles ou modifiées.

Nous vérifions d'abord si le fichier d'état Timer.start.stateexiste, sinon terminons avec un message. Si la minuterie a démarré et que les fichiers existent, alors nous continuons et faisons quelques calculs:
1. Aller à l' :TIMEOUTendroit où nous produisons les secondes écoulées. Vous pouvez choisir une meilleure étiquette pour cela ...
2. SET /P %Timer% ... lit l'heure de début du fichier et attribue une valeur à la %Timer%variable.
3. SET /A Elapsed ... calcule les secondes entre l'heure de début et maintenant.
4. ECHO "Seconds ... renvoie la valeur calculée (secondes depuis le démarrage de la minuterie.

Comment obtenir le temps restant:

Vous pouvez soustraire %Elapsed%de %MaxTime%:

@ECHO OFF
GetTimerValue
SET /A TimeLeft=%MaxTime%-%Elapsed%
ECHO "You have %TimeLeft% seconds remaining"

OK, expliqué assez. Voici le script complet Timer.cmd:

À ce stade, j'ai oublié tout ce qui a déjà été dit. Ce fichier de commandes fonctionne ici de manière autonome, il n'y a donc pas de fichier séparé StartTimer.cmdou GetTimerValue.cmduniquement celui-ci Timer.cmd. Fondamentalement, il est toujours le même, mais le flux de code est différent et l'utilisation est également complètement différente. Cependant, cela n'enregistre pas l'état dans le fichier, vous ne pouvez donc plus obtenir la valeur de la minuterie après la déconnexion / le redémarrage, si vous avez besoin de cet exemple d'utilisation ci-dessus pour enregistrer / lire l'état dans / depuis le fichier.

Utilisation / aide pour Timer.cmdest imprimé lorsqu'il est exécuté sans arguments. Je n'ai pas entièrement testé cela et il peut y avoir des fautes de frappe, etc., les arguments ne sont pas vérifiés à toute épreuve.

@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

Intégration avec shutdownou toute autre commande:

Fichier poweroff.cmd:

@ECHO OFF
Timer start %1
shutdown -t %1 -s

Utilisation: poweroff <wait_seconds>pour démarrer l'arrêt programmé et Timer getpour obtenir le temps écoulé / restant.

Sampo Sarrala - codidact.org
la source
Je vous félicite pour l'effort. Je viens de réaliser à quel point la question était mal formulée, mais vous avez quand même réussi à y répondre. Juste pour ça, vous obtenez un vote positif. Malheureusement, cela ne fonctionne pas avec les commandes d'arrêt arbitraires, c'est-à-dire qu'elles StartTimer.cmddoivent être explicitement appelées. J'avais écrit un petit programme pour résoudre mon problème, que je publierai lorsque je reviendrai sur mon ordinateur.
Bob
Ok, j'accepte ça. J'ai fini par écrire un programme C # nommé shutdown.exe, qui s'appelait shutdown_original.exe. Il vérifierait le /tdrapeau et s'il existait, créerait un fichier avec les heures de début et de fin enregistrées. Lors de la récupération des heures ( /retrieveindicateur), il vérifierait le journal des événements pour voir si un démarrage ou un abandon avait été effectué depuis le démarrage de la minuterie. Je ne sais pas comment cela aurait géré les hibernations. Je ne vais pas publier le code ou le programme: c'est un bug bug. Et pour que le programme fonctionne, je devais beaucoup jouer avec les paramètres de sécurité, que je ne voulais pas promouvoir.
Bob
Le concept de base consistait à intercepter l' shutdown.exeappel et à enregistrer les heures dans un fichier, ce que vous avez fait et pourquoi j'accepte cela.
Bob
2
@Bob - Vous alliez publier un article sur votre programme à votre retour? Liens vers exe / code source?
Alex S