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 shutdown
commande 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 wmic
l'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-6
signification %%a-%%f
séparée par Spaceor
TAB.
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.cmd
donc j'explique seulement les lignes nouvelles ou modifiées.
Nous vérifions d'abord si le fichier d'état Timer.start.state
existe, 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' :TIMEOUT
endroit 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.cmd
ou GetTimerValue.cmd
uniquement 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.cmd
est 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 shutdown
ou 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 get
pour obtenir le temps écoulé / restant.
/c <time>
).