TheShaner
asked on
Setting the Date in a Batch file - Is there a better way?
You will have to pardon me, as I am not a batch file guru by any means. I have a batch file I am working on that I am trying to set three variables:
1. Set current date
2. Set previous day
3. Set 2 days ago
Here is what I have so far, I would like to see if anyone can tell me a more intelligent way to do this, as it looks rather repetitive.
REM SET DATE VARIABLES
for /f "tokens=1-5 delims=/- " %%f in ('Date/t') do (
set dw=%%f
set mm=%%g
set dd=%%h
set yy=06
)
Then I go and set the previous day and two days ago
REM SET PREVIOUS DAY VARIABLE
if %dd%==01 GOTO PREVIOUSMONTH
if %dd%==02 GOTO PREVIOUSMONTH2
if %dd%==03 set pd=02
if %dd%==03 set pd2=01
if %dd%==04 set pd=03
if %dd%==04 set pd2=02
if %dd%==05 set pd=04
if %dd%==05 set pd2=03
if %dd%==06 set pd=05
if %dd%==06 set pd2=04
if %dd%==07 set pd=06
if %dd%==07 set pd2=05
if %dd%==08 set pd=07
if %dd%==08 set pd2=06
if %dd%==09 set pd=08
if %dd%==09 set pd2=07
if %dd%==10 set pd=09
if %dd%==10 set pd2=08
if %dd%==11 set pd=10
if %dd%==11 set pd2=09
if %dd%==12 set pd=11
if %dd%==12 set pd2=10
if %dd%==13 set pd=12
if %dd%==13 set pd2=11
if %dd%==14 set pd=13
if %dd%==14 set pd2=12
if %dd%==15 set pd=14
if %dd%==15 set pd2=13
etc..
Is there a better way to do this?
1. Set current date
2. Set previous day
3. Set 2 days ago
Here is what I have so far, I would like to see if anyone can tell me a more intelligent way to do this, as it looks rather repetitive.
REM SET DATE VARIABLES
for /f "tokens=1-5 delims=/- " %%f in ('Date/t') do (
set dw=%%f
set mm=%%g
set dd=%%h
set yy=06
)
Then I go and set the previous day and two days ago
REM SET PREVIOUS DAY VARIABLE
if %dd%==01 GOTO PREVIOUSMONTH
if %dd%==02 GOTO PREVIOUSMONTH2
if %dd%==03 set pd=02
if %dd%==03 set pd2=01
if %dd%==04 set pd=03
if %dd%==04 set pd2=02
if %dd%==05 set pd=04
if %dd%==05 set pd2=03
if %dd%==06 set pd=05
if %dd%==06 set pd2=04
if %dd%==07 set pd=06
if %dd%==07 set pd2=05
if %dd%==08 set pd=07
if %dd%==08 set pd2=06
if %dd%==09 set pd=08
if %dd%==09 set pd2=07
if %dd%==10 set pd=09
if %dd%==10 set pd2=08
if %dd%==11 set pd=10
if %dd%==11 set pd2=09
if %dd%==12 set pd=11
if %dd%==12 set pd2=10
if %dd%==13 set pd=12
if %dd%==13 set pd2=11
if %dd%==14 set pd=13
if %dd%==14 set pd2=12
if %dd%==15 set pd=14
if %dd%==15 set pd2=13
etc..
Is there a better way to do this?
@echo off
setlocal
REM SET DATE VARIABLES
for /f "tokens=1-5 delims=/- " %%f in ('Date/t') do (
set dw=%%f
set mm=%%g
set dd=%%h
set yy=06
)
REM SET PREVIOUS DAY VARIABLE
if %dd%==01 GOTO PREVIOUSMONTH
if %dd%==02 GOTO PREVIOUSMONTH2
set /a pd=dd-1
set /a pd2=dd-2
echo %dd% %pd% %pd2%
echo %dw% %mm% %dd% %yy%
(But there's a better way to get today's date, using %date%)
setlocal
REM SET DATE VARIABLES
for /f "tokens=1-5 delims=/- " %%f in ('Date/t') do (
set dw=%%f
set mm=%%g
set dd=%%h
set yy=06
)
REM SET PREVIOUS DAY VARIABLE
if %dd%==01 GOTO PREVIOUSMONTH
if %dd%==02 GOTO PREVIOUSMONTH2
set /a pd=dd-1
set /a pd2=dd-2
echo %dd% %pd% %pd2%
echo %dw% %mm% %dd% %yy%
(But there's a better way to get today's date, using %date%)
Here's my code that does the trick:
@echo off
setlocal
call :GETDATEPARTS "%date%"
call :DISPLAYDATE
set currentDate=%yy%/%dd%/%mm%
call :SUBTRACTDAYS 1
call :DISPLAYDATE
set yesterday=%yy%/%dd%/%mm%
call :SUBTRACTDAYS 1
call :DISPLAYDATE
set daybeforeyesterday=%yy%/%d d%/%mm%
goto :EOF
REM ************************** ********** ********** *****
:GETDATEPARTS
set dt=%~1
set tok=1-3
if "%dt:~0,1%" GTR "9" set tok=2-4
set yyyy=
for /f "tokens=%tok% delims=.:/-, " %%a in ('echo %~1') do (
for /f "skip=1 tokens=2-4 delims=/-,()." %%x in ('echo.^|date') do set %%x=%%a&set %%y=%%b&set %%z=%%c
)
if not "%yyyy%"=="" set yy=%yyyy%
if 1%yy% LSS 1000 (if %yy% LSS 70 (set yy=20%yy%) else (set yy=19%yy%))
if 1%mm% LSS 100 set mm=0%mm%
if 1%dd% LSS 100 set dd=0%dd%
goto :EOF
REM ************************** ********** ********** *****
:DISPLAYDATE
echo Date: %yy%/%mm%/%dd%
goto :EOF
REM ************************** ********** ********** *****
:SUBTRACTDAYS
set dayCnt=%1
if "%dayCnt%"=="" set dayCnt=1
REM Substract your days here
set /A dd=1%dd% - 100 - %dayCnt%
set /A mm=1%mm% - 100
:CHKDAY
if /I %dd% GTR 0 goto DONESUBTRACT
set /A mm=%mm% - 1
if /I %mm% GTR 0 goto ADJUSTDAY
set /A mm=12
set /A yy=%yy% - 1
:ADJUSTDAY
if %mm%==1 goto SET31
if %mm%==2 goto LEAPCHK
if %mm%==3 goto SET31
if %mm%==4 goto SET30
if %mm%==5 goto SET31
if %mm%==6 goto SET30
if %mm%==7 goto SET31
if %mm%==8 goto SET31
if %mm%==9 goto SET30
if %mm%==10 goto SET31
if %mm%==11 goto SET30
REM ** Month 12 falls through
:SET31
set /A dd=31 + %dd%
goto CHKDAY
:SET30
set /A dd=30 + %dd%
goto CHKDAY
:LEAPCHK
set /A tt=%yy% %% 4
if not %tt%==0 goto SET28
set /A tt=%yy% %% 100
if not %tt%==0 goto SET29
set /A tt=%yy% %% 400
if %tt%==0 goto SET29
:SET28
set /A dd=28 + %dd%
goto CHKDAY
:SET29
set /A dd=29 + %dd%
goto CHKDAY
:DONESUBTRACT
if /I %mm% LSS 10 set mm=0%mm%
if /I %dd% LSS 10 set dd=0%dd%
goto :EOF
Good Luck,
Steve
@echo off
setlocal
call :GETDATEPARTS "%date%"
call :DISPLAYDATE
set currentDate=%yy%/%dd%/%mm%
call :SUBTRACTDAYS 1
call :DISPLAYDATE
set yesterday=%yy%/%dd%/%mm%
call :SUBTRACTDAYS 1
call :DISPLAYDATE
set daybeforeyesterday=%yy%/%d
goto :EOF
REM **************************
:GETDATEPARTS
set dt=%~1
set tok=1-3
if "%dt:~0,1%" GTR "9" set tok=2-4
set yyyy=
for /f "tokens=%tok% delims=.:/-, " %%a in ('echo %~1') do (
for /f "skip=1 tokens=2-4 delims=/-,()." %%x in ('echo.^|date') do set %%x=%%a&set %%y=%%b&set %%z=%%c
)
if not "%yyyy%"=="" set yy=%yyyy%
if 1%yy% LSS 1000 (if %yy% LSS 70 (set yy=20%yy%) else (set yy=19%yy%))
if 1%mm% LSS 100 set mm=0%mm%
if 1%dd% LSS 100 set dd=0%dd%
goto :EOF
REM **************************
:DISPLAYDATE
echo Date: %yy%/%mm%/%dd%
goto :EOF
REM **************************
:SUBTRACTDAYS
set dayCnt=%1
if "%dayCnt%"=="" set dayCnt=1
REM Substract your days here
set /A dd=1%dd% - 100 - %dayCnt%
set /A mm=1%mm% - 100
:CHKDAY
if /I %dd% GTR 0 goto DONESUBTRACT
set /A mm=%mm% - 1
if /I %mm% GTR 0 goto ADJUSTDAY
set /A mm=12
set /A yy=%yy% - 1
:ADJUSTDAY
if %mm%==1 goto SET31
if %mm%==2 goto LEAPCHK
if %mm%==3 goto SET31
if %mm%==4 goto SET30
if %mm%==5 goto SET31
if %mm%==6 goto SET30
if %mm%==7 goto SET31
if %mm%==8 goto SET31
if %mm%==9 goto SET30
if %mm%==10 goto SET31
if %mm%==11 goto SET30
REM ** Month 12 falls through
:SET31
set /A dd=31 + %dd%
goto CHKDAY
:SET30
set /A dd=30 + %dd%
goto CHKDAY
:LEAPCHK
set /A tt=%yy% %% 4
if not %tt%==0 goto SET28
set /A tt=%yy% %% 100
if not %tt%==0 goto SET29
set /A tt=%yy% %% 400
if %tt%==0 goto SET29
:SET28
set /A dd=28 + %dd%
goto CHKDAY
:SET29
set /A dd=29 + %dd%
goto CHKDAY
:DONESUBTRACT
if /I %mm% LSS 10 set mm=0%mm%
if /I %dd% LSS 10 set dd=0%dd%
goto :EOF
Good Luck,
Steve
@echo off
setlocal
set D=%date%
set y=%D:~10,4%
set m=%D:~4,2%
set d=%D:~7,2%
echo %y%-%m%-%d%
REM SET PREVIOUS DAY VARIABLE
if %d%==01 GOTO PREVIOUSMONTH
if %d%==02 GOTO PREVIOUSMONTH2
set /a pd=d-1
set /a pd2=d-2
echo %d% %pd% %pd2%
setlocal
set D=%date%
set y=%D:~10,4%
set m=%D:~4,2%
set d=%D:~7,2%
echo %y%-%m%-%d%
REM SET PREVIOUS DAY VARIABLE
if %d%==01 GOTO PREVIOUSMONTH
if %d%==02 GOTO PREVIOUSMONTH2
set /a pd=d-1
set /a pd2=d-2
echo %d% %pd% %pd2%
Actually, the first part would be better with dates constructed yy/mm/dd
@echo off
setlocal
call :GETDATEPARTS "%date%"
call :DISPLAYDATE
set currentDate=%yy%/%mm%/%dd%
call :SUBTRACTDAYS 1
call :DISPLAYDATE
set yesterday=%yy%/%mm%/%dd%
call :SUBTRACTDAYS 1
call :DISPLAYDATE
set daybeforeyesterday=%yy%/%m m%/%dd%
goto :EOF
...
@echo off
setlocal
call :GETDATEPARTS "%date%"
call :DISPLAYDATE
set currentDate=%yy%/%mm%/%dd%
call :SUBTRACTDAYS 1
call :DISPLAYDATE
set yesterday=%yy%/%mm%/%dd%
call :SUBTRACTDAYS 1
call :DISPLAYDATE
set daybeforeyesterday=%yy%/%m
goto :EOF
...
@echo off
setlocal
:: Date
set D=%date%
set y=%D:~10,4%
set m=%D:~4,2%
set dw=%D:~0,3%
set d=%D:~7,2%
:: Time
set T=%time%
set H=%T:~0,2%
set M=%T:~3,2%
set S=%T:~6,2%
set ms=%T:~9,2%
echo %dw% %y%-%m%-%d% %H%:%M%:%S%:%ms%
REM SET PREVIOUS DAY VARIABLE
if %d%==01 GOTO PREVIOUSMONTH
if %d%==02 GOTO PREVIOUSMONTH2
set /a pd=d-1
set /a pd2=d-2
echo %d% %pd% %pd2%
setlocal
:: Date
set D=%date%
set y=%D:~10,4%
set m=%D:~4,2%
set dw=%D:~0,3%
set d=%D:~7,2%
:: Time
set T=%time%
set H=%T:~0,2%
set M=%T:~3,2%
set S=%T:~6,2%
set ms=%T:~9,2%
echo %dw% %y%-%m%-%d% %H%:%M%:%S%:%ms%
REM SET PREVIOUS DAY VARIABLE
if %d%==01 GOTO PREVIOUSMONTH
if %d%==02 GOTO PREVIOUSMONTH2
set /a pd=d-1
set /a pd2=d-2
echo %d% %pd% %pd2%
NOT the answer to your question ...... but when I needed to do some date checks I hadn't discovered all SteveGTR's fancy batch file routines and didn't fancy writing my own (though not shy of doing so having written worked out my own Julian date handling code from scratch in QB back in the 90's) so I actually took an easy option of using a language which understood dates already and used this code to pass the dates into the batch file and scheduled the job to use the VBS file. This code actually pulls out todays date an yesterdays date or on a Monday Friday and Saturday's date but changing the no. of days subtracted from the date is easy enough. If for whatever reason you do want to use VBS then will gladly elaborate.
Steve
' Save as Yourscript.vbs
Dim NextDay,SameDay,Monday
Dim WSHShell
Set WSHShell = WScript.CreateObject("WScr ipt.Shell" )
' Check for day 2 ( Monday) and set days to Friday & Saturday otherwise Today & Yesterday
if weekday(date)<>2 then
NextDay=date
SameDay=nextday-1
Monday=""
else
NextDay=date-2
SameDay=nextday-3
Monday="Monday"
end if
' Write out dates in correct formats mm-dd-yyyy
' Today or Saturday
thedate=NextDay
NextDay=right("0" & month(thedate),2) + "-" + right("0" & day(thedate),2) + "-" + right(year(thedate),4)
' Friday or Yesterday
thedate=SameDay
SameDay=right("0" & month(thedate),2) + "-" + right("0" & day(thedate),2) + "-" + right(year(thedate),4)
' Run batch file normal format and wait for it complete
WSHShell.Run "s:\bkuprept\scripts\autob kck.bat " & SameDay & " " & NextDay & " " & Monday , 1, true
Set WSHShell = Nothing
WScript.Quit(0)
Steve
' Save as Yourscript.vbs
Dim NextDay,SameDay,Monday
Dim WSHShell
Set WSHShell = WScript.CreateObject("WScr
' Check for day 2 ( Monday) and set days to Friday & Saturday otherwise Today & Yesterday
if weekday(date)<>2 then
NextDay=date
SameDay=nextday-1
Monday=""
else
NextDay=date-2
SameDay=nextday-3
Monday="Monday"
end if
' Write out dates in correct formats mm-dd-yyyy
' Today or Saturday
thedate=NextDay
NextDay=right("0" & month(thedate),2) + "-" + right("0" & day(thedate),2) + "-" + right(year(thedate),4)
' Friday or Yesterday
thedate=SameDay
SameDay=right("0" & month(thedate),2) + "-" + right("0" & day(thedate),2) + "-" + right(year(thedate),4)
' Run batch file normal format and wait for it complete
WSHShell.Run "s:\bkuprept\scripts\autob
Set WSHShell = Nothing
WScript.Quit(0)
ASKER
Steve, your script works perfectly. One more small thing and it's yours. I have tried mod'ing it to only show a 2 digit year, as I am actually taking the 3 parts of the date and using them to build a string which corresponds with the file names I am trying to download, and am not having too much luck. Can you show me what needs to be changed?
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
set /a pd2=dd-2