6} How does one get yesterday's date?
Utilizing
G(nu)Awk we can demonstrate
@echo off & setlocal enableextensions
gawk
'BEGIN{printf"%%s\n",strftime("%%x",systime()-24*60*60)}
'
set back_=1
gawk 'BEGIN{printf"@set datewas_=%%s\n",
^
strftime("%%d.%%m.%%Y",systime()-%back_%*24*60*60)}'
^
>>"%TEMP%\tmp$$$.cmd"
for %%f in (call del) do %%f "%TEMP%\tmp$$$.cmd"
echo The date was %datewas_%
endlocal & goto :EOF
The output will be something like
Wed Nov 19 2003
The date was 19.11.2003
As a side issue also notice continuing a line with the caret
^.
There is a catch. If one uses a more recent GnuWin32 gawk then with
that gawk port (let's call it unxgawk) one has to adjust the syntax
to
@echo off & setlocal enableextensions
unxgawk "BEGIN{printf\"%%s\n\",strftime(\"%%x\",systime()-24*60*60)}"
set back_=1
unxgawk "BEGIN{printf\"@set datewas_=%%s\n\",strftime(\"%%d.%%m.%%Y\",systime()-%back_%*24*60*60)}">>"%TEMP%\tmp$$$.cmd"
for %%f in (call del) do %%f "%TEMP%\tmp$$$.cmd"
echo The date was %datewas_%
endlocal & goto :EOF
This task could also be performed using Zeller's congruence. It will
take some programming. External date to/from Julian date number
programs are utilized in the solution below
@echo off
::
:: This option is not valid beyond 32-bit
if defined ProgramW6432 (
echo/
echo Exiting: %~f0 is incompatible with 64-bit Windows
goto :EOF)
::
:: Get and show today's Julian date number
:: Requires DATE2NUM.EXE from tscmd.zip
DATE2NUM /set > "%mytemp%\tmp$$$.cmd"
for %%c in (call del) do %%c "%mytemp%\tmp$$$.cmd"
echo datenum_=%datenum_%
::
:: Calculate yesterday's Julian date number
set /a yesterday_=%datenum_% -1
::
:: Convert it back into a date
:: Requires NUM2DATE.EXE from tscmd.zip
NUM2DATE %yesterday_% /set > "%mytemp%\tmp$$$.cmd"
for %%c in (call del) do %%c "%mytemp%\tmp$$$.cmd"
echo dd_=%dd_% mm_=%mm_% yyyy_=%yyyy_%
::
:: Clean up
for %%v in (datenum_ yesterday_ dd_ mm_ yyyy_) do set %%v=
The output would be something like
D:\TEST>cmdfaq
datenum_=2452982
dd_=7 mm_=12 yyyy_=2003
Yesterday's date problem can also be solved with a Visual Basic Script
(VBScript) aided command line script
@echo off & setlocal enableextensions
:: Build a Visual Basic Script
findstr "'VBS" "%~f0"|findstr /v "findstr" > tmp$$$.vbs
:: Run it with Microsoft Windows Script Host Version 5.6
cscript //nologo tmp$$$.vbs
:: Call the command line script the script host built
call tmp$$$.cmd
:: Clean up
for %%f in (tmp$$$.vbs tmp$$$.cmd) do if exist %%f del %%f
:: Show the result
echo %date%
echo yd_=%yd_%
endlocal & goto :EOF
'
Dim oShell 'VBS
Set oShell = WScript.CreateObject ("WSCript.shell") 'VBS
oShell.run "cmd /c echo @set yd_=" & DateAdd("d",
-1,Date) & " > tmp$$$.cmd" 'VBS
The output would be something like
D:\TEST>cmdfaq
31.01.2004
yd_=30.01.2004
Or, more concisely
@echo off & setlocal enableextensions
set vbs_=%temp%\tmp$$$.vbs
>"%vbs_%" echo WScript.Echo DateAdd("d",-1,Date)
for /f "tokens=* delims=" %%a in (
'cscript //nologo "%vbs_%"') do set yd_=%%a
for %%f in ("%vbs_%") do if exist %%f del %%f
:: Show the result
echo %date%
echo yd_=%yd_%
endlocal & goto :EOF
Just for the sake of demonstration, even if not
necessary for this item in any way, the usage of usebackq
@echo off & setlocal enableextensions
set vbs_=%temp%\tmp$$$.vbs
>"%vbs_%" echo WScript.Echo DateAdd("d",-1,Date)
for /f "usebackq tokens=* delims=" %%a in (
`cscript //nologo "%vbs_%"`) do set yd_=%%a
for %%f in ("%vbs_%") do if exist %%f del %%f
:: Show the result
echo %date%
echo yd_=%yd_%
endlocal & goto :EOF
Also see items
#31
and
#147.
Furthermore, see the related
EDATE.CMD
and
GDATE.CMD
scripts accompanying
tscmd.zip