问题很有趣,所以我写了一批可以为您做的工作。
基本上它是倒数计时器,我没有shutdown
为此添加命令,但将其留作家庭作业。计算不准确,这并不关心leap年,月份的长度……主要是为了提高可读性,因为我想让它易于学习。
当前有两个文件一起工作,一个启动计时器,另一个启动计时器,它告诉您从计时器启动起经过了多少时间。这两个文件可以很容易地组合到一个cmd脚本中,这样您就可以使某些行可重用(如定义的方法)。
好吧,让我们看一下脚本,
这里是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
以以下内容开头FOR /F "skip=1 ...
:
1.询问wmic
当前时间和日期。
2.将输出的第一行(标题)跳过skip=1
3.通过使用由分隔的tokens=1-6
含义读取值。4.存储值的变量,... ,...%%a-%%f
Spaceor
TAB
%DateY%
%TimeH%
%TimeM%
在此行的开头,SET /A EPOCH=...
我们使用表达式来计算经过的秒数1.1.1970
(这是简单的近似值,不是真正的unix时间。如果需要准确的信息,请参阅Google)。
然后最后一行ECHO %EPOCH% > ...
将计算出的时间写入名为“ Timer.start.state
”的文件。
在这里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
在这里,代码流从上到下不是线性的。首先,我们将GOTO CHECKFILE
标签标记为执行命令实际上始于:CHECKFILE
。这里的很多事情都与之相同,StartTimer.cmd
因此我只解释新的或更改的行。
首先,我们检查状态文件是否Timer.start.state
存在,如果不存在,则终止机智消息。如果计时器已启动并且文件存在,则我们继续进行一些数学运算:
1.跳至:TIMEOUT
输出经过的秒数的位置。您可以为此选择更好的标签...
2. SET /P %Timer% ...
从文件中读取开始时间,并将值分配给%Timer%
变量。
3. SET /A Elapsed ...
计算从开始时间到现在的秒数。
4. ECHO "Seconds ...
回显计算出的值(自计时器启动以来的秒数)。
如何获得剩余时间:
您可以。减去%Elapsed%
来自%MaxTime%
:
@ECHO OFF
GetTimerValue
SET /A TimeLeft=%MaxTime%-%Elapsed%
ECHO "You have %TimeLeft% seconds remaining"
好的,解释够了。这是完整的脚本Timer.cmd
:
至此,忘记了已经说过的一切。这里的批处理文件是单独工作的,因此没有单独的StartTimer.cmd
或GetTimerValue.cmd
只有this的Timer.cmd
。基本上还是一样,但是代码流不同,用法也完全不同。但是,这不会将状态保存到文件,因此,如果您需要上面的使用示例将状态保存到文件/从文件中读取,则注销/重新引导后就无法再获取计时器值。
Timer.cmd
当不带参数运行时,将打印用法/帮助。我尚未对此进行完整的测试,并且可能存在一些错别字等,args并非经过严格的检查。
@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
与shutdown
或任何其他命令集成:
档案poweroff.cmd
:
@ECHO OFF
Timer start %1
shutdown -t %1 -s
用法:poweroff <wait_seconds>
启动定时关机并Timer get
获取已用时间/剩余时间。
/c <time>
)一样修改shutdown命令。