Creating a file name as a timestamp in a batch job
Solution 1
CP source.log %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%.log
But it's locale dependent. I'm not sure if %DATE%
is localized, or depends on the format specified for the short date in Windows.
Here is a locale-independent way to extract the current date from this answer, but it depends on WMIC
and FOR /F
:
FOR /F %%A IN ('WMIC OS GET LocalDateTime ^| FINDSTR \.') DO @SET B=%%A
CP source.log %B:~0,4%-%B:~4,2%-%B:~6,2%.log
Solution 2
This worked for me and was a filename-safe solution (though it generates a MM-dd-YYYY format):
C:\ set SAVESTAMP=%DATE:/=-%@%TIME::=-%
C:\ set SAVESTAMP=%SAVESTAMP: =%
C:\ set SAVESTAMP=%SAVESTAMP:,=.%.jpg
C:\ echo %SAVESTAMP%
[email protected]
The first command takes a DATE and replaces /
with -
, takes the TIME and replaces :
with -
, and combines them into DATE@TIME format. The second set
statement removes any spaces, and the third set
replaces ,
with .
and appends the .jpg
extension.
The above code is used in a little script that pulls images from a security IP Camera for further processing:
:while
set SAVESTAMP=%DATE:/=-%@%TIME::=-%
set SAVESTAMP=%SAVESTAMP: =%
set SAVESTAMP=%SAVESTAMP:,=.%.jpg
wget-1.10.2.exe --tries=0 -O %SAVESTAMP% http://admin:<password>@<ip address>:<port>/snapshot.cgi
timeout 1
GOTO while
Solution 3
For French Locale (France) ONLY, be careful because /
appears in the date :
echo %DATE%
08/09/2013
For our problem of log file, here is my proposal for French Locale ONLY:
SETLOCAL
set LOGFILE_DATE=%DATE:~6,4%.%DATE:~3,2%.%DATE:~0,2%
set LOGFILE_TIME=%TIME:~0,2%.%TIME:~3,2%
set LOGFILE=log-%LOGFILE_DATE%-%LOGFILE_TIME%.txt
rem log-2014.05.19-22.18.txt
command > %LOGFILE%
Solution 4
Because the idea of tearing %DATE%
and %TIME%
apart and mashing them back together seems fragile at best, here's an alternative that uses a powershell oneliner:
for /f %i in ('powershell -c "get-date -format yyyy-MM-dd--HH-mm-ss"') do @set DATETIME=%i
set LOGFILE=my-script-%DATETIME%.txt
Reference for get-date
is here, with format options for both .NET-style and UNIX-style.
Solution 5
Here is a locale independent solution (copy to a file named SetDateTimeComponents.cmd):
@echo off
REM This script taken from the following URL:
REM http://www.winnetmag.com/windowsscripting/article/articleid/9177/windowsscripting_9177.html
REM Create the date and time elements.
for /f "tokens=1-7 delims=:/-, " %%i in ('echo exit^|cmd /q /k"prompt $d $t"') do (
for /f "tokens=2-4 delims=/-,() skip=1" %%a in ('echo.^|date') do (
set dow=%%i
set %%a=%%j
set %%b=%%k
set %%c=%%l
set hh=%%m
set min=%%n
set ss=%%o
)
)
REM Let's see the result.
echo %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss%
I put all my .cmd scripts into the same folder (%SCRIPTROOT%); any script that needs date/time values will call SetDateTimeComponents.cmd as in the following example:
setlocal
@echo Initializing...
set SCRIPTROOT=%~dp0
set ERRLOG=C:\Oopsies.err
:: Log start time
call "%SCRIPTROOT%\SetDateTimeComponents.cmd" >nul
@echo === %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss% : Start === >> %ERRLOG%
:: Perform some long running action and log errors to ERRLOG.
:: Log end time
call "%SCRIPTROOT%\SetDateTimeComponents.cmd" >nul
@echo === %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss% : End === >> %ERRLOG%
As the example shows, you can call SetDateTimeComponents.cmd whenever you need to update the date/time values. Hiding the time parsing script in it's own SetDateTimeComponents.cmd file is a nice way to hide the ugly details, and, more importantly, avoid typos.
Eoin Campbell
Husband/Dad @ Home, Senior Technical Architect @ ChannelSight, Photographer & Gamer in my spare time. I keep an irregularly updated blog @ http://trycatch.me/
Updated on December 02, 2021Comments
-
Eoin Campbell over 2 years
We have a batch job that runs every day and copies a file to a pickup folder. I want to also take a copy of that file and drop it into an archive folder with the filename
yyyy-MM-dd.log
What's the easiest way to do this in a Windows batch job?
I'm basically looking for an equivalent of this Unix command:
cp source.log `date +%F`.log