Using dates in 'DOS' batch files has always been tricky as it has no built in ways of extracting date information. There are many tricks using string manipulation to pull out parts of the %date% variable or output of the date /t command but these rely heavily on the regional settings of the user the script is running as.
If a quick and dirty date or time stamp for a filename, for instance, is required you can use some simple character substitution to amend the date / time entries to remove the / and : characters so that they can be used in a filename, e.g.
results in a filename like "File 09-07-2009 9-37-42.40.txt"
or "File Thu 09-07-2009 9-37-42.40.txt"
or "File Thu 07-09-2009 9-37-42.40.txt"
or "File 07-09-2009 9-37-42.40.txt"
etc.
which is why extracting strings from a date is unreliable.
VBScript can be be used to extract day names, parts of the date etc. and combined into a batch file by using a for command to read the data ouput by a VB Script (amongst other ways). This simple one line VBscript for instance returns all the various parts of a date that may be needed and can be used as in the example to construct a filename / path for instance:
wscript.echo weekdayname(weekday(date)) & "," & weekday(date) & "," & weekdayname(weekday(date),true) & "," & day(date) & "," & month(date) & "," & year(date) & "," & monthname(month(date),false) &"," & monthname(month(date),true)
1:
Select allOpen in new window
That could be called dateparts.vbs and stored somewhere for running or constructed on the fly from the batch file, e.g. in the user's temp folder. All that is needed is to escape the & characters with a ^ and use redirection (>) to create a temporary VBS file:
@echo off
echo wscript.echo weekdayname(weekday(date)) ^& "," ^& weekday(date) ^& "," ^& weekdayname(weekday(date),true) ^& "," ^& day(date) ^& "," ^& month(date) ^& "," ^& year(date) ^& "," ^& monthname(month(date),false) ^&"," ^& monthname(month(date),true) > "%temp%\dateparts.vbs"
1:
2:
Select allOpen in new window
This can then be read using a for command taking the output from this file into environment variables:
for /f "tokens=1-8 delims=," %%a in ('cscript //nologo "%temp%\dateparts.vbs"') do set weekday=%%a& set weekdaynum=%%b& set shortday=%%c& set day=%%d& set month=%%e& set year=%%f& set monthname=%%g& set shortmonth=%%h
1:
Select allOpen in new window
and displayed or used to make filenames, directories or compared to run differently depending upon the day -- e.g. run a full backup on a Friday etc.
echo Weekday: %weekday%
echo weekdaynum: %weekdaynum%
echo shortday: %shortday%
echo day: %day%
echo month: %month%
echo monthname: %monthname%
echo shortmonth: %shortmonth%
echo year: %year%
set filename="D:\files\%year%\%shortmonth%\Report for %day%-%month%-%year% (%weekday%).txt"
echo The filename is %filename%
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Select allOpen in new window
If only certain parts are required the VBScript and/or batch file for command can be amended, e.g.
@echo off
echo wscript.echo weekday(date) ^& "," ^& day(date) ^& "," ^& month(date) ^& "," ^& year(date) > "%temp%\dateparts.vbs"
for /f "tokens=1-4 delims=," %%a in ('cscript //nologo "%temp%\dateparts.vbs"') do set weekday=%& set day=%%d& set month=%%e& set year=%%f
if %weekday%==Fri echo It is Friday. & goto fullbackup
goto normalbackup
:fullbackup
echo Backing up to Z:\backups\weekly\%year%-%month%-%day%.zip
rem backup commands
goto :eof
:normalbackup
echo Backing up to Z:\backups\daily\%year%-%month%-%day%.zip
rem backup commands
goto :eof
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Select allOpen in new window
by: dragon-it on 2009-09-04 at 09:14:00ID: 3225
More details on how to return the parts you want from VBScript, this is Friday 4th September 2009:
Friday true) Fri e) September ) Sep
Start a line with wscript.echo which means to send to the console whatever follows then whichever of the date components you need:
weekdayname(weekday(date))
weekday(date) 6
weekdayname(weekday(date),
day(date) 4
right(100+day(date),2) 04
month(date) 9
right(100+month(date),2) 09
year(date) 2009
right(year(date),2) 09
monthname(month(date),fals
monthname(month(date),true
combine those with
^& "," ^&
between each (to create this VBS from a batch file then before each & character you have to escape it with a ^)
The FOR loop will then send each entry from your comma seperated listed into %%a %%b %%c etc. which you can then assign to variables.
e.g. if you only need mm and yy then you could use:
echo wscript.echo right(100+month(date),2) ^& "," ^& right(year(date),2) >"%temp%\dateparts.vbs"
for /f "tokens=1-2 delims=," %%a in ('cscript //nologo "%temp%\dateparts.vbs"') do set mm=%%a& set yy=%%b
echo Year is %yy% and Month is %mm%