La domanda era interessante, quindi ho scritto un batch che può fare il lavoro per te.
Fondamentalmente è il conto alla rovescia, non ho incluso il shutdown
comando a questo ma l'ho lasciato a casa. I calcoli non sono accurati, questo non importa degli anni bisestili, della durata del mese, ... questo è principalmente per la leggibilità in quanto volevo che fosse facile da imparare.
Attualmente ci sono due file che fanno un lavoro insieme, uno avvia il timer e l'altro, quando chiamato, indica quanto tempo è trascorso dall'avvio del timer. Questi due file possono essere facilmente combinati in uno script cmd, in questo modo è possibile rendere riutilizzabili alcune righe ( come i metodi definiti ).
Ok, diamo un'occhiata agli script,
Ecco qui 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 linea con FOR /F "skip=1 ...
:
1. Richiedi wmic
ora e data attuali.
2. Salta la prima riga dell'output, ovvero i titoli, di skip=1
3. Leggi i valori usando il tokens=1-6
significato %%a-%%f
separato da Spaceor
TAB.
4. Memorizzare i valori alle variabili %DateY%
, ... %TimeH%
, %TimeM%
...
Dopodiché all'inizio della riga SET /A EPOCH=...
utilizziamo un'espressione che calcola i secondi trascorsi da1.1.1970
( questo è un tempo approssimativo semplice, non reale di unix. Vedi Google se hai bisogno di precisione ).
Quindi all'ultima riga ECHO %EPOCH% > ...
scrive il tempo calcolato nel file chiamato " Timer.start.state
".
E qui 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
Qui il flusso del codice non è lineare dall'alto verso il basso. Prima di tutto GOTO CHECKFILE
etichettiamo quindi i comandi di esecuzione iniziano davvero alla riga che dice :CHECKFILE
. Molte cose qui sono esattamente le stesse di StartTimer.cmd
così spiego solo linee nuove o modificate.
Per prima cosa controlliamo se Timer.start.state
esiste un file di stato , altrimenti non terminiamo il messaggio. Se il timer è stato avviato e i file esistono, continuiamo e facciamo un po 'di matematica:
1. Passa al punto in :TIMEOUT
cui abbiamo emesso i secondi trascorsi. Puoi scegliere un'etichetta migliore per questo ...
2. SET /P %Timer% ...
legge l'ora di inizio dal file e assegna il valore alla %Timer%
variabile.
3. SET /A Elapsed ...
calcola i secondi tra l'ora di inizio e ora.
4. ECHO "Seconds ...
echeggia il valore calcolato (secondi dall'avvio del timer.
Come ottenere il tempo rimanente:
Puoi sottrarre %Elapsed%
da %MaxTime%
:
@ECHO OFF
GetTimerValue
SET /A TimeLeft=%MaxTime%-%Elapsed%
ECHO "You have %TimeLeft% seconds remaining"
OK, spiegato abbastanza. Ecco lo script completo Timer.cmd
:
A questo punto, ho dimenticato tutto già detto. Questo file batch qui funziona da solo, quindi non esiste un separato StartTimer.cmd
o GetTimerValue.cmd
solo questo Timer.cmd
. Fondamentalmente è sempre lo stesso, ma il flusso di codice è diverso e anche l'utilizzo è completamente diverso. Questo, tuttavia, non salva lo stato nel file, quindi non è più possibile ottenere il valore del timer dopo la disconnessione / il riavvio, se è necessario questo esempio di cui sopra per salvare / leggere lo stato nel / dal file.
L'uso / aiuto per Timer.cmd
viene stampato quando eseguito senza argomenti. Non l'ho ancora testato completamente e potrebbero esserci alcuni errori di battitura, ecc., Args non sono controllati a prova di errore.
@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
Integrazione con shutdown
o qualsiasi altro comando:
File poweroff.cmd
:
@ECHO OFF
Timer start %1
shutdown -t %1 -s
Utilizzo: poweroff <wait_seconds>
per avviare lo spegnimento temporizzato e Timer get
per ottenere il tempo trascorso / rimanente.
/c <time>
).