%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.