A pergunta foi interessante, então eu escrevi um lote que pode fazer um trabalho para você.
Basicamente, é temporizador de contagem regressiva, eu não incluí shutdown
comando, mas o deixei como lição de casa. Os cálculos não são precisos, isso não se importa com anos bissextos, duração do mês, ... isso é principalmente para facilitar a leitura, pois eu queria facilitar a aprendizagem.
Atualmente, existem dois arquivos trabalhando juntos, um inicia o cronômetro e outro, quando chamado, informa quanto tempo decorreu do início do cronômetro. Esses dois arquivos podem ser facilmente combinados em um script de cmd, dessa forma você também pode reutilizar algumas linhas ( como métodos definidos ).
Ok, vamos dar uma olhada nos scripts,
Aqui está 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
De acordo com FOR /F "skip=1 ...
:
1. Peça wmic
a hora e a data atuais.
2. Pule a primeira linha de saída, que é o cabeçalho, por skip=1
3. Leia os valores usando o tokens=1-6
significado %%a-%%f
separado por Spaceor
TAB.
4. Armazenar valores para as variáveis %DateY%
, ... %TimeH%
, %TimeM%
...
Depois disso, no início da linha SET /A EPOCH=...
, usamos uma expressão que calcula os segundos decorridos1.1.1970
( este é o tempo aproximado simples, não o unix real. Consulte o Google se precisar ).
Então, na última linha, ECHO %EPOCH% > ...
escreve o tempo calculado no arquivo chamado " Timer.start.state
".
E aqui 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
Aqui o fluxo de código não é linear de cima para baixo. Primeiro, GOTO CHECKFILE
rotulamos para que os comandos de execução realmente iniciem na linha que diz :CHECKFILE
. Muitas coisas aqui são exatamente as mesmas, StartTimer.cmd
então só explico linhas novas ou alteradas.
Primeiro, verificamos se o arquivo de estado Timer.start.state
existe; caso contrário, encerramos a mensagem de humor. Se o timer iniciar e os arquivos existirem, continuamos e fazemos algumas contas:
1. Vá para o local :TIMEOUT
onde produzimos os segundos decorridos. Você pode escolher uma etiqueta melhor para isso ...
2. SET /P %Timer% ...
lê a hora de início do arquivo e atribui valor à %Timer%
variável.
3. SET /A Elapsed ...
calcula segundos entre a hora de início e agora.
4. ECHO "Seconds ...
reproduz o valor calculado (segundos desde a inicialização do timer.
Como obter tempo restante:
Você pode subtrair %Elapsed%
de %MaxTime%
:
@ECHO OFF
GetTimerValue
SET /A TimeLeft=%MaxTime%-%Elapsed%
ECHO "You have %TimeLeft% seconds remaining"
OK, explicou o suficiente. Aqui está o script completo Timer.cmd
:
Neste ponto, esqueci tudo o que já foi dito. Esse arquivo em lotes aqui está funcionando por si próprio, portanto não há separadores StartTimer.cmd
ou GetTimerValue.cmd
apenas isso Timer.cmd
. Basicamente, ainda é o mesmo, mas o fluxo de código é diferente e o uso também é completamente diferente. No entanto, isso não salva o estado no arquivo, assim você não pode mais obter o valor do timer após o logoff / reinicialização, se você precisar deste exemplo de uso acima para salvar / ler o estado no / do arquivo.
O uso / ajuda para Timer.cmd
é impresso quando executado sem argumentos. Eu não testei completamente isso e pode haver alguns erros de digitação etc., os argumentos não são verificados à prova de falhas.
@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
Integre com shutdown
ou qualquer outro comando:
Arquivo poweroff.cmd
:
@ECHO OFF
Timer start %1
shutdown -t %1 -s
Uso: poweroff <wait_seconds>
para iniciar o desligamento programado e Timer get
obter o tempo decorrido / restante.
/c <time>
).