Using dates in batch files / scripts

AID: 1153
  • Status: Published

19536 points

  • Bydragon-it
  • TypeTips/Tricks
  • Posted on2009-07-09 at 02:24:27
Awards
  • Community Pick
  • Experts Exchange Approved
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.

set filename="File %date:/=-%%time::=-%".txt
                                    
1:

Select allOpen in new window


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

getdatebits.cmd.txt
  • 854 bytes
  • Save as getdatebits.cmd
getdatebits.cmd.txt
Asked On
2009-07-09 at 02:24:27ID1153
Tags

MSDOS Batch Script Date

Topic

MS DOS

Views
4557

Comments

Author Comment

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:

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))       Friday
weekday(date)                   6
weekdayname(weekday(date),true)       Fri
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),false)      September
monthname(month(date),true)       Sep

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%

Author Comment

by: dragon-it on 2009-12-08 at 01:33:37ID: 6271

To get yesterdays date use date-1  in place of date in any of the scripts...

@echo off
echo wscript.echo year(date - 1) ^& right(100 + month(date-1),2) ^& right(100+day(date-1 ),2)  > "%temp%\dateparts.vbs"
for /f "tokens=1 delims=" %%a in ('cscript //nologo "%temp%\dateparts.vbs"') do set yesterday=%%a
echo %yesterday%

or more generically this script will take a date from the command line formatted as YYYYMMDD and return the day before it - it creates a date in the VBScript using DateSerial then takes one off it then uses that date to output YYYYMMDD as above:

@echo off
if [%~1]==[] echo Usage: %0 YYYYMMDD returns the day before this date & pause & exit /b

REM Get date in yyyymmdd from command line as %1 and construct to use in
(echo nextday=DateSerial^(left^("%~1",4^),mid^("%~1",5,2^),mid^("%~1",7,2^)^)-1
echo wscript.echo year^(nextday^) ^& right^(100+month^(nextday^),2^) ^& right^(100+day^(nextday^),2^)
)>"%temp%\getdate.vbs"
echo Remove these lines, just showing you the script it has created as VBScript after pressing any key
pause
notepad "%temp%\getdate.vbs"

for /f "tokens=* delims=" %%a in ('cscript //nologo "%temp%\getdate.vbs"') do set thedate=%%a
echo %thedate%
pause

Expert Comment

by: kdyer on 2010-09-26 at 22:01:00ID: 19934

Notice you are using alot of VBS files..  How about in pure batch?

http://www.robvanderwoude.com/datetimentparse.php

http://www.robvanderwoude.com/datetimentexamples.php

http://www.robvanderwoude.com/datetimentbasics.php

Note: Don't be too daunted by the following as it is heavily documented..

http://www.robvanderwoude.com/files/sorttime3_nt.txt

HTH,

Kent

Author Comment

by: dragon-it on 2010-09-27 at 01:00:45ID: 19938

Agreed it CAN be done this way, the REG.EXE command is not in Windows 2000 or previous versions though for instance though it could be done using a regedit export and parsing the .REG file in those cases like in some of the examples.

All in all though a single line of VBScript I find easier to quickly add into a script when needed and remember how to write it if needed without having to lookup the script.

Steve

Author Comment

by: dragon-it on 2011-03-12 at 22:49:58ID: 24644

Author Comment

by: dragon-it on 2011-03-12 at 22:56:52ID: 24645

Some more prebuilt example scripts for common requests.

Add your Comment

Please Sign up or Log in to comment on this article.

Join Experts Exchange Today

Gain Access to all our Tech Resources

Get personalized answers

Ask unlimited questions

Access Proven Solutions

Search 3.2 million solutions

Read In-Depth How-To Guides

1000+ articles, demos, & tips

Watch Step by Step Tutorials

Learn direct from top tech pros

And Much More!

Your complete tech resource

See Plans and Pricing

30-day free trial. Register in 60 seconds.

Loading Advertisement...

Top MS DOS Experts

  1. billprew

    140,280

    Master

    0 points yesterday

    Profile
    Rank: Genius
  2. paultomasi

    49,157

    10 points yesterday

    Profile
    Rank: Master
  3. dragon-it

    35,867

    0 points yesterday

    Profile
    Rank: Genius
  4. oBdA

    30,202

    0 points yesterday

    Profile
    Rank: Savant
  5. gerwinjansen

    25,227

    0 points yesterday

    Profile
    Rank: Sage
  6. ReneGe

    24,598

    0 points yesterday

    Profile
    Rank: Guru
  7. QCubed

    23,732

    0 points yesterday

    Profile
    Rank: Guru
  8. Bartender_1

    11,800

    0 points yesterday

    Profile
    Rank: Sage
  9. RobSampson

    10,800

    0 points yesterday

    Profile
    Rank: Genius
  10. Qlemo

    10,191

    0 points yesterday

    Profile
    Rank: Genius
  11. BillDL

    8,800

    0 points yesterday

    Profile
    Rank: Genius
  12. lionelmm

    7,446

    0 points yesterday

    Profile
    Rank: Master
  13. DaveBaldwin

    7,136

    0 points yesterday

    Profile
    Rank: Genius
  14. l33tf0b

    6,600

    0 points yesterday

    Profile
    Rank: Wizard
  15. sirbounty

    6,400

    0 points yesterday

    Profile
    Rank: Genius
  16. leew

    6,320

    0 points yesterday

    Profile
    Rank: Savant
  17. pony10us

    5,000

    0 points yesterday

    Profile
    Rank: Wizard
  18. ve3ofa

    4,552

    0 points yesterday

    Profile
    Rank: Genius
  19. ltlbearand3

    4,300

    0 points yesterday

    Profile
    Rank: Wizard
  20. TazDevil1674

    4,300

    0 points yesterday

    Profile
    Rank: Master
  21. Run5k

    4,196

    0 points yesterday

    Profile
    Rank: Genius
  22. DTHConsulting

    4,186

    0 points yesterday

    Profile
    Rank: Guru
  23. serialband

    4,000

    0 points yesterday

    Profile
    Rank: Master
  24. Anuroopsundd

    4,000

    0 points yesterday

    Profile
    Rank: Sage
  25. thinkpads_user

    3,750

    0 points yesterday

    Profile
    Rank: Genius

Hall Of Fame