Die Frage war interessant, also habe ich einen Stapel geschrieben , der für Sie arbeiten kann.
Im Grunde ist es ein Countdown-Timer, ich habe keinen shutdown
Befehl dazu eingefügt, sondern ihn als Hausaufgabe belassen. Berechnungen sind nicht genau, es geht nicht um Schaltjahre, Monatslänge, ... dies dient hauptsächlich der Lesbarkeit, da ich es einfach erlernen wollte.
Derzeit arbeiten zwei Dateien zusammen. Eine startet den Timer und die andere gibt beim Aufrufen an, wie viel Zeit seit dem Start des Timers vergangen ist. Diese beiden Dateien können ziemlich einfach zu einem Cmd-Skript kombiniert werden. Auf diese Weise können Sie auch einige Zeilen wiederverwendbar machen ( wie definierte Methoden ).
Okay, schauen wir uns die Skripte an.
Hier ist 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
In Übereinstimmung mit FOR /F "skip=1 ...
:
1. Fragen Sie wmic
nach der aktuellen Uhrzeit und dem aktuellen Datum.
2. Zur ersten Zeile der Ausgabe, die Überschriften ist durch skip=1
3. Lesen Sie Werte mit tokens=1-6
Bedeutungs %%a-%%f
durch getrennt Spaceor
TAB.
4. Speichern Sie die Werte für Variablen %DateY%
, ... %TimeH%
, %TimeM%
, ...
Danach verwenden SET /A EPOCH=...
wir beim Zeilenanfang einen Ausdruck, der die verstrichenen Sekunden1.1.1970
berechnet ( dies ist eine einfache ungefähre, keine echte Unix-Zeit. Siehe Google, wenn Sie genaue Informationen benötigen ).
Dann ECHO %EPOCH% > ...
schreibt in der letzten Zeile die berechnete Zeit in die Datei " Timer.start.state
".
Und hier 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
Hier ist der Codefluss von oben nach unten nicht linear. Zuerst GOTO CHECKFILE
beschriften wir, damit Ausführungsbefehle wirklich in der Zeile beginnen, in der steht :CHECKFILE
. Viele Dinge hier sind genauso wie bei, StartTimer.cmd
deshalb erkläre ich nur neue oder geänderte Zeilen.
Zuerst prüfen wir, ob eine Statusdatei Timer.start.state
vorhanden ist. Wenn nicht, beenden wir die Nachricht. Wenn der Timer gestartet wurde und Dateien vorhanden sind, fahren wir fort und rechnen nach:
1. Springen Sie zu der Stelle, :TIMEOUT
an der wir die verstrichenen Sekunden ausgegeben haben. Sie können dafür eine bessere Bezeichnung wählen ...
2. SET /P %Timer% ...
Liest die Startzeit aus der Datei und weist der %Timer%
Variablen einen Wert zu .
3. SET /A Elapsed ...
berechnet Sekunden zwischen Startzeit und jetzt.
4. gibt ECHO "Seconds ...
den berechneten Wert wieder (Sekunden seit dem Start des Timers).
So erhalten Sie die verbleibende Zeit:
Sie können subtrahieren %Elapsed%
von %MaxTime%
:
@ECHO OFF
GetTimerValue
SET /A TimeLeft=%MaxTime%-%Elapsed%
ECHO "You have %TimeLeft% seconds remaining"
OK, genug erklärt. Hier ist das vollständige Skript Timer.cmd
:
Zu diesem Zeitpunkt habe ich alles vergessen, was bereits gesagt wurde. Diese Batch-Datei hier arbeitet alleine, es gibt also keine separate StartTimer.cmd
oder GetTimerValue.cmd
nur diese Timer.cmd
. Grundsätzlich ist es immer noch dasselbe, aber der Codefluss ist unterschiedlich und die Verwendung ist auch völlig anders. Dies speichert den Status jedoch nicht in einer Datei, sodass Sie nach dem Abmelden / Neustarten keinen Timer-Wert mehr erhalten können. Wenn Sie dieses Beispiel oben benötigen, um den Status in einer Datei zu speichern / lesen.
Verwendung / Hilfe für Timer.cmd
wird gedruckt, wenn sie ohne Argumente ausgeführt wird. Ich habe dies nicht vollständig getestet und es kann einige Tippfehler usw. geben, Argumente sind nicht narrensicher geprüft.
@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
Integrieren mit shutdown
oder einem anderen Befehl:
Datei poweroff.cmd
:
@ECHO OFF
Timer start %1
shutdown -t %1 -s
Verwendung: poweroff <wait_seconds>
um das zeitgesteuerte Herunterfahren zu starten und Timer get
die verstrichene / verbleibende Zeit zu erhalten.
/c <time>
) geändert wird.