%TIME% stamping
I'm a command-line dinosaur. Vim (Vi IMproved) is my favorite text editor. And I write quite a few little batch files.
Here are a few useful tricks that work with cmd.exe on Windows XP.
Timestamped filename
Sometimes I want to create a file whose name includes the
current date and time.
By combining the magic %DATE% and %TIME%
environment variables, with for /f and a little
bit of string substitution, I can create that filename.
REM
REM "Tue 06/14/2005" -> "06/14/2005"
REM
for /f "tokens=2" %%i in ("%DATE%") do set MDY=%%i
REM
REM "06/14/2005" -> "2005-06-14"
REM
for /f "delims=/ tokens=1,2,3" %%i in ("%MDY%") do set YMD=%%k-%%i-%%j
REM "16:44:39.72" -> "1644"
REM
for /f "delims=: tokens=1,2" %%i in ("%TIME%") do set HM=%%i%%j
REM
REM " 237" -> "0237" (%TIME% < 10:00:00.00 contains a leading space)
set HM=%HM: =0%
xcopy /yf %1 %YMD%_%HM%.bak
See for /? and set /? to explain
everything that the comments don't.
Timing Operations
Sometimes it's useful to time operations.
@setlocal
@if (%_echo%)==() set _echo=off
@echo %_echo%
call :time T1
set T2=%T1%
set Iter=0
@echo T1 = %T1%
:repeat
CostlyOperation.exe
call :time T2
set /A DeltaT=%T2% - %T1%
set /A Iter=%Iter% + 1
set /A Avg=%DeltaT% / %Iter%
@echo DeltaT = %DeltaT%, Avg = %Avg%, Iter = %Iter%, T2 = %T2%
goto :repeat
:time
set TT=%TIME%
for /f "delims=: tokens=1" %%i in ("%TT%") do set hrs=%%i
for /f "delims=: tokens=2" %%i in ("%TT%") do set min=1%%i
for /f "delims=: tokens=3" %%i in ("%TT%") do set sec=1%%i
for /f "delims=. tokens=1" %%i in ("%sec%") do set sec=%%i
set /A %1=3600 * %hrs% + 60 * (%min%-100) + (%sec%-100)
goto :EOF
The :time subroutine calculates the number of seconds
that have elapsed today. The business with 100 is to handle the case that
min or sec is 08 or 09,
which Cmd's expression evaluator considers to be malformed
octal.
set /? explains set /A arithmetic.
call /? explains subroutine syntax and
goto :EOF.
Extending this code so that it works past midnight is left as the proverbial exercise for the reader.