Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date cmd脚本中的日期算法_Date_Batch File_Cmd_Scripting - Fatal编程技术网

Date cmd脚本中的日期算法

Date cmd脚本中的日期算法,date,batch-file,cmd,scripting,Date,Batch File,Cmd,Scripting,我需要编写一个脚本,将文件名从aDate.txt更改为bDate.txt,其中: aDate是yyyymmdd格式的当前系统日期,并且 bDate是yyyymmdd格式的当前系统日期-1 我目前有: set yy=%date:~6,2% set mm=%date:~3,2% set dd=%date:~0,2% if "%date:~6,1%"==" " set yy=0%yy:~1,1% if "%date:~3,1%"==" " set mm=0%mm:~1,1% if "%date:~

我需要编写一个脚本,将文件名从aDate.txt更改为bDate.txt,其中:

  • aDate是yyyymmdd格式的当前系统日期,并且
  • bDate是yyyymmdd格式的当前系统日期-1
我目前有:

set yy=%date:~6,2%
set mm=%date:~3,2%
set dd=%date:~0,2%
if "%date:~6,1%"==" " set yy=0%yy:~1,1%
if "%date:~3,1%"==" " set mm=0%mm:~1,1%
if "%date:~0,1%"==" " set dd=0%dd:~1,1%
SET sys_date=20%yy%%mm%%dd%
ECHO %sys_date%
REM still have to do this bit properly
SET sys_date_yesterday=%sys_date%a
move %sys_date%.txt %sys_date_yesterday%.txt
但是我不知道怎么做date-1的事情(除了冗长的)从天减去1,如果那是=0,那么从月份减去1,并将day=设置为新月份的最后一天,以此类推多年


有什么想法吗?

你必须用困难的方法来做。我建议使用SteveGTR提供的解决方案。我复制了下面的文本,因为至少我不能总是在那个网站上看到解决方案


这是我开发的一个批处理文件,用于从当前日期减去任意天数。它接受天数的命令行参数。默认值为1天(昨天):

祝你好运,
史蒂夫

我需要一些东西,在检查闰年等时,从当前日期中减去天数,这非常有效

我只需要使用所需的参数(减去天数)从那些脚本中调用它,然后让它使用替换回调调用脚本,并为修改(减去的)日期将参数传递回原始脚本

以下是一些例子:

需要日期计算变量集的脚本:

IF "%1"=="" goto modifydate

:modifydate
SET subtractdays=5
SET ModDateScript=\\servershare\path\Called_Scripts\ModDate.cmd
CALL "%ModDateScript%" %subtractdays% "%~fnx0"
脚本,该脚本将计算%moddate%参数并将其传回原始调用脚本,以将其设置为变量进行相应处理。您只需将其放在调用的脚本末尾,以修改/减去当前日期(ModDate.cmd)的天数

我能够测试并确定来自原始脚本的以下行:

set yyyy=
set $tok=1-3
for /f "tokens=1 delims=.:/-, " %%u in ('date /t') do set $d1=%%u
if "%$d1:~0,1%" GTR "9" set $tok=2-4
for /f "tokens=%$tok% delims=.:/-, " %%u in ('date /t') do (
for /f "skip=1 tokens=2-4 delims=/-,()." %%x in ('echo.^|date') do (
    set %%x=%%u
    set %%y=%%v
    set %%z=%%w
    set $d1=
    set $tok=))
if "%yyyy%"=="" set yyyy=%yy%
if /I %yyyy% LSS 100 set /A yyyy=2000 + 1%yyyy% - 100
可以仅用这一行替换,它也可以正常工作:

FOR /F "tokens=2-4 delims=/ " %%A IN ("%date%") DO SET "mm=%%A" DO (& SET "dd=%%B") DO (& SET "yyyy=%%C")
请解释一下这些行(我改为只有一行和语句的行)的作用,因为我不能很快看出它们之间的区别。我从19世纪开始减法,我觉得它很准确。我想这可能有助于处理修改后的年份小于2000年的计算——但我没有看到,除非我遗漏了什么

否则,可以轻松调用这一个脚本,并将%mm%/%dd%/%yyyy%作为需要自己计算的几个脚本的参数传回。非常有效的批量解决方案。我可以将参数作为%1、%2、%3等传递,并且仍然在脚本中为当前日期使用setlocal——只需创建一个类似moddate=%1等的变量即可

最后,我要求任何批处理脚本专家进一步优化此脚本,并将结果发回给批处理人员进行测试

谢谢,
P

换句话说,请尝试使用此代码。您可以将其用作脚本子例程,或将其与调用和参数函数一起使用,以传递回原始批处理文件:

:: Pass 1st parameter as number of days (whole numbers) to subtract from current day in   date
:: This script is able to subtract days to any date of the current date
:: This script will check for leap years, etc. as well
@echo on
::for /f "tokens=2-4 delims=/ " %%A in ("%date%") do set "mm=%%A" do & set "dd=%%B" do & set "yyyy=%%C"
set "mm=%date:~4,2%" & set "dd=%date:~7,2%" & set "yyyy=%date:~10,4%"
set CurDate=%mm%/%dd%/%yyyy%
set dayCnt=%1
if "%dayCnt%"=="" set dayCnt=1
:: Substract your days here
set /A dd=1%dd% - 100 - %dayCnt%
set /A mm=1%mm% - 100
:CHKDAY
if /I %dd% GTR 0 goto DONE
set /A mm=%mm% - 1
if /I %mm% GTR 0 goto ADJUSTDAY
set /A mm=12
set /A yyyy=%yyyy% - 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
:: ** Month 12 falls through
:SET31
set /A dd=31 + %dd%
goto CHKDAY
:SET30
set /A dd=30 + %dd%
goto CHKDAY
:LEAPCHK
set /A tt=%yyyy% %% 4
if not %tt%==0 goto SET28
set /A tt=%yyyy% %% 100
if not %tt%==0 goto SET29
set /A tt=%yyyy% %% 400
if %tt%==0 goto SET29
:SET28
set /A dd=28 + %dd%
goto CHKDAY
:SET29
set /A dd=29 + %dd%
goto CHKDAY
:DONE
if /I %mm% LSS 10 set mm=0%mm%
if /I %dd% LSS 10 set dd=0%dd%
echo Date %dayCnt% day(s) before %CurDate% is %mm%/%dd%/%yyyy%
SET DirDate=%mm%/%dd%/%yyyy%
:: The %2 parameter is passed from the calling script as the full path and name of the          file to call back
:: %2 equals %~fnx0
:: The dirdate variable is passed as parameter %1 back to the calling script
Call %2 %dirdate%
GOTO EOF
我将寻找一个vb或其他更有效的工具,我仍然可以合并或调用批处理来动态计算日期。

使用Windows批处理脚本轻松地从日期中添加或减去天数 下面是我提出的一个解决方案,用于使用批处理脚本计算日期(加法或减法)。根据您的需要设置相应的变量,然后根据您的需要调整逻辑。这非常适合我的需要,它包含在同一个批处理脚本中,没有太多逻辑

要添加:您还可以使用此脚本通过删除减号
-
将天数添加到当前日期
例程中下面批处理脚本中的符号:dynamicvbscriptbuild
因此,在看到此
的地方,-%MinusDay%,
只需删除减号即可在这些行中的每一行上获得
,%MinusDay%,
,现在
MinusDay=
变量值将等于您要添加的天数

重要注意事项:使用
MinusDays=
值进行减法时,五个9(
99999
)似乎是批处理脚本的限制。当使用
MinusDays=
值进行添加时,似乎六个9(
999999
)是批处理脚本的限制

批处理脚本

@ECHO ON

::// Minus days is the number of days to subtract from the CURRENT DAY i.e. 2 for minus 2 days or 99999 for minus 99999 days from when it's run
SET MinusDay=2

:: This calls the temp vbs script routine that will be used to set YYYY-MM-DD values for the subtracted days date you specify
CALL :DynamicVBSScriptBuild

FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%YYYYTmpVBS%"') DO SET YYYY=%%A
FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%MMTmpVBS%"') DO SET MM=%%A
FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%DDTmpVBS%"') DO SET DD=%%A

::// Set your web server log file path in the below variable
SET WebServerLogPath=C:\WebServer\Logs

::// Set web server log file name where YYYY MM DD variables are set to the values after the day numbers setup above are subtracted
SET YYYY=%YYYY%
SET MM=%MM%
SET DD=%DD%

ECHO %YYYY%%MM%%DD%
PAUSE

GOTO EOF

:DynamicVBSScriptBuild
SET YYYYTmpVBS=%temp%\~tmp_yyyy.vbs
SET MMTmpVBS=%temp%\~tmp_mm.vbs
SET DDTmpVBS=%temp%\~tmp_dd.vbs
IF EXIST "%YYYYTmpVBS%" DEL /Q /F "%YYYYTmpVBS%"
IF EXIST "%MMTmpVBS%" DEL /Q /F "%MMTmpVBS%"
IF EXIST "%DDTmpVBS%" DEL /Q /F "%DDTmpVBS%"
ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%YYYYTmpVBS%"
ECHO yyyy = Year(dt)                    >> "%YYYYTmpVBS%"
ECHO WScript.Echo yyyy                  >> "%YYYYTmpVBS%"
ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%MMTmpVBS%"
ECHO mm = Right("0" ^& Month(dt),2)     >> "%MMTmpVBS%"
ECHO WScript.Echo mm                    >> "%MMTmpVBS%"
ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%DDTmpVBS%"
ECHO dd = Right("0" ^& Day(dt),2)       >> "%DDTmpVBS%"
ECHO WScript.Echo dd                    >> "%DDTmpVBS%"
GOTO EOF

进一步资源

在ss64.com上找到此脚本:(许可证:)

您可以将它分开,并从批处理文件中调用它,而不会使代码混乱,它将用操作结果填充一些环境变量

例如,这将从当前日期减去一天(在我的系统上,日期以“dd/mm/yyyy”格式返回):

剧本:

   @ECHO off
   SETLOCAL
   :: DateMath, a general purpose date math routine

   :: If DateMath detects an error, variable _dd_int is set to 999999.
   SET v_dd_int=0
   SET v_mm_int=0 
   SET v_yy_int=0
   SET v_ymd_str=
   SET v_mm_str=
   SET v_dd_str=

   IF "%3"=="" goto s_syntax
   IF "%4"=="+" goto s_validate_year
   IF "%4"=="-" goto s_validate_year
   IF "%4"=="" goto s_validate_year

   :s_syntax
   echo:
   echo DATEMATH SYNTAX:
   echo _______________
   echo:
   echo DateMath will set the variables as listed below
   echo 'str' variables include leading zeros e.g. "01"
   echo 'int' variables leading zeros are stripped e.g. "1"
   echo:
   echo CALL DateMath YY MM DD - YY2 MM2 DD2 
   echo:
   echo Will set variable _dd_int to the signed difference
   echo between the 2 dates (measured in days)
   echo:
   echo:
   echo CALL DateMath YY MM DD +/- Days 
   echo:
   echo Will set the following variables to the result of 
   echo adding or substracting days from the initial date:
   echo    _ymd_str, _yy_int
   echo    _mm_str, _mm_int,
   echo    _dd_str, _dd_int
   echo:
   echo:
   echo ___________________________________
   pause

   echo:
   echo:
   echo CALL DateMath YY MM DD
   echo:
   echo Will set the following variables:
   echo    _ymd_str, _yy_int
   echo    _mm_str, _mm_int,
   echo    _dd_str, _dd_int
   echo:
   echo ___________________________________
   echo:
   echo _ymd_str is in YYYYMMDD format.
   echo:
   echo _yy_int is in YYYY format, even if YY format was originally supplied.
   echo This conversion is useful for FAT/NTFS file dates which are in YY format.
   echo:

   ENDLOCAL & SET /a _dd_int=999999
   goto :eof

   :s_validate_year
   ::strip leading zeros
    SET v_yy=%1
    if %v_yy:~0,1% EQU 0 set v_yy=%v_yy:~1%

    :: Check for Y2K
    IF %v_yy% LSS 100 IF %v_yy% GEQ 80 SET /A v_yy += 1900
    IF %v_yy% LSS 80 SET /A v_yy += 2000

    :: at this point v_yy contains a 4 digit year

   ::validate month and day
    if %2 GTR 12 goto s_syntax
    if %3 GTR 31 goto s_syntax

    SET v_mm=%2
    SET v_dd=%3

    ::strip leading zeros
    if %v_mm:~0,1% EQU 0 set v_mm=%v_mm:~1%
    if %v_dd:~0,1% EQU 0 set v_dd=%v_dd:~1%

   :: Set the int variables
    SET /a v_dd_int=%v_dd%
    SET /a v_yy_int=%v_yy%
    SET /a v_mm_int=%v_mm%

   :: Determine which function to perform - ADD, SUBTRACT or CONVERT

    If not "%6"=="" goto s_validate_2nd_date 
    if "%4"=="" goto s_convert_only

   :: Add or subtract  days to a date
    SET /a v_number_of_days=%5
    goto s_add_or_subtract_days

   :s_convert_only

    SET /a v_dd_int=%v_dd%
    IF %v_dd% LEQ 9 (SET v_dd_str=0%v_dd%) ELSE (SET v_dd_str=%v_dd%)
    IF %v_mm% LEQ 9 (SET v_mm_str=0%v_mm%) ELSE (SET v_mm_str=%v_mm%)
    SET v_ymd_str=%v_yy%%v_mm_str%%v_dd_str%

   ECHO DATEMATH - Convert date only (no maths)
   goto s_end
   ::::::::::::::::::::::::::::::::::::::::::::::::::

   :s_validate_2nd_date
    If "%4"=="+" goto s_syntax
    :: Subtracting one date from another ::::::
    :: strip leading zero
    SET v_yy2=%5
    if %v_yy2:~0,1% EQU 0 set v_yy2=%v_yy2:~1%

    if %v_yy2% GTR 99 goto s_validate2nd_month
    if %v_yy2% GTR 49 goto s_prefix_2_1950_1999
    if %v_yy2% LSS 10 goto s_prefix_2_2000_2009
    SET v_yy2=20%v_yy2%
    goto s_validate2nd_month

   :s_prefix_2_2000_2009
    SET v_yy2=200%v_yy2%
    goto s_validate2nd_month

   :s_prefix_2_1950_1999
    SET v_yy2=19%v_yy2%

   :s_validate2nd_month
    ::strip leading zeros
    ::SET /a v_yy2=%v_yy2%
    if %v_yy2:~0,1% EQU 0 set v_yy2=%v_yy2:~1%
    ::v_yy2 now contains a 4 digit year

    if %6 GTR 12 goto s_syntax
    SET v_mm2=%6

    if %7 GTR 31 goto s_syntax
    SET v_dd2=%7

    ::strip leading zeros
    ::SET /a v_mm2=%v_mm2%
    if %v_mm2:~0,1% EQU 0 set v_mm2=%v_mm2:~1%
    ::SET /a v_dd2=%v_dd2%
    if %v_dd2:~0,1% EQU 0 set v_dd2=%v_dd2:~1%

   call :s_julian_day %v_yy_int% %v_mm_int% %v_dd_int%
   SET v_sumdays1=%v_JulianDay%

   call :s_julian_day %v_yy2% %v_mm2% %v_dd2%
   SET v_sumdays2=%v_JulianDay%

   SET /a v_dd_int=%v_sumdays1% - %v_sumdays2%

   ECHO DATEMATH - Subtracting one date from another = days difference
   ECHO ~~~~~~
   ECHO %v_dd_int%
   ECHO ~~~~~~
   goto s_end_days
   ::::::::::::::::::::::::::::::::::::::::::::::::::

   :s_add_or_subtract_days
   if /i "%4"=="+" goto s_add_up_days

   :: Subtract all days ::::::
   SET /a v_dd=%v_dd% - %v_number_of_days%

   :s_adjust_month_year
   if %v_dd% GEQ 1 goto s_add_subtract_days_DONE
   SET /a v_mm=%v_mm% - 1
   if %v_mm% GEQ 1 goto s_add_days_%v_mm%
   SET /a v_yy=%v_yy% - 1
   SET /a v_mm=%v_mm% + 12
   goto s_add_days_%v_mm%

   :s_add_days_2
   SET /a v_dd=%v_dd% + 28
   SET /a v_leapyear=%v_yy% / 4
   SET /a v_leapyear=%v_leapyear% * 4
   if %v_leapyear% NEQ %v_yy% goto s_adjust_month_year
   SET /a v_dd=%v_dd% + 1
   goto s_adjust_month_year

   :s_add_days_4
   :s_add_days_6
   :s_add_days_9
   :s_add_days_11
   SET /a v_dd=%v_dd% + 30
   goto s_adjust_month_year

   :s_add_days_1
   :s_add_days_3
   :s_add_days_5
   :s_add_days_7
   :s_add_days_8
   :s_add_days_10
   :s_add_days_12
   SET /a v_dd=%v_dd% + 31
   goto s_adjust_month_year

   :s_add_up_days
   :: add all days ::::::
   SET /a v_dd=%v_dd% + %v_number_of_days%

   :s_subtract_days_
   goto s_subtract_days_%v_mm%

   :s_adjust_mth_yr
   SET /a v_mm=%v_mm% + 1
   if %v_mm% LEQ 12 goto s_subtract_days_%v_mm%
   SET /a v_yy=%v_yy% + 1
   SET /a v_mm=%v_mm% - 12
   goto s_subtract_days_%v_mm%

   :s_subtract_days_2
   SET /a v_leapyear=%v_yy% / 4
   SET /a v_leapyear=%v_leapyear% * 4
   If %v_leapyear% EQU %v_yy% goto s_subtract_leapyear

   if %v_dd% LEQ 28 goto s_add_subtract_days_DONE
   SET /a v_dd=%v_dd% - 28
   goto s_adjust_mth_yr

   :s_subtract_leapyear
   if %v_dd% LEQ 29 goto s_add_subtract_days_DONE
   SET /a v_dd=%v_dd% - 29
   goto s_adjust_mth_yr

   :s_subtract_days_4
   :s_subtract_days_6
   :s_subtract_days_9
   :s_subtract_days_11
   if %v_dd% LEQ 30 goto s_add_subtract_days_DONE
   SET /a v_dd=%v_dd% - 30
   goto s_adjust_mth_yr

   :s_subtract_days_1
   :s_subtract_days_3
   :s_subtract_days_5
   :s_subtract_days_7
   :s_subtract_days_8
   :s_subtract_days_10
   :s_subtract_days_12
   if %v_dd% LEQ 31 goto s_add_subtract_days_DONE
   SET /a v_dd=%v_dd% - 31
   goto s_adjust_mth_yr

   :s_add_subtract_days_DONE
   SET /a v_dd_int=%v_dd%
   SET /a v_mm_int=%v_mm%
   SET /a v_yy_int=%v_yy%
   IF %v_dd% GTR 9 (SET v_dd_str=%v_dd%) ELSE (SET v_dd_str=0%v_dd%)
   IF %v_mm% GTR 9 (SET v_mm_str=%v_mm%) ELSE (SET v_mm_str=0%v_mm%)
   SET v_ymd_str=%v_yy%%v_mm_str%%v_dd_str%

   ECHO DATEMATH - add or subtract days from a date = new date
   goto s_end
   ::::::::::::::::::::::::::::::::::::::::::::::::::

   :s_julian_day
   SET v_year=%1
   SET v_month=%2
   SET v_day=%3

   SET /a v_month=v_month
   SET /a v_day=v_day

   SET /A a = 14 - v_month
   SET /A a /= 12
   SET /A y = v_year + 4800 - a
   SET /A m = v_month + 12 * a - 3
   SET /A m = 153 * m + 2
   SET /A m /= 5
   SET /A v_JulianDay = v_day + m + 365 * y + y / 4 - y / 100 + y / 400 - 32045

   ECHO The Julian Day is [%v_JulianDay%]
   goto :eof
   ::::::::::::::::::::::::::::::::::::::::::::::::::

   :s_end
   ECHO ~~~~~~~~~~~~
   ECHO [%v_ymd_str%] YY=[%v_yy_int%] MM=[%v_mm_str%] DD=[%v_dd_str%]
   ECHO ~~~~~~~~~~~~
   :s_end_days
   ENDLOCAL&SET /a _yy_int=%v_yy_int%&SET /a _mm_int=%v_mm_int%&SET /a _dd_int=%v_dd_int%&SET _ymd_str=%v_ymd_str%&SET _mm_str=%v_mm_str%&SET _dd_str=%v_dd_str%

可以通过向批处理文件添加jscript代码来完成。 下面是只接受一个参数的
dayAdder.bat
,即要添加到当前日期并打印结果的天数:

  @if (@X) == (@Y) @end /* JScript comment 
    @echo off   
    cscript //E:JScript //nologo "%~f0" %*
    exit /b %errorlevel%       
@if (@X)==(@Y) @end JScript comment */

var days=parseInt(WScript.Arguments.Item(0));


Date.prototype.addDays = function(days) {
    var date = new Date(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
}

var date = new Date();

WScript.Echo(date.addDays(5));
WScript.Echo("Year: " + date.getFullYear());
WScript.Echo("Month: " + date.getMonth());
WScript.Echo("DayOfTeWEek: " + date.getDay());
examaple和输出:

E:\scripts>dayAdder.bat 7
Sun Nov 8 16:27:48 UTC+0200 2020
Year: 2020
Month: 10
DayOfTeWEek: 2
DayOfTheMonth: 3

你可以用适合你的方式修改它。

即使是上面的获取日期的例子也似乎有点冗长:(这绝对必须在一个直接的批处理文件中完成吗?几乎在任何“适当”的文件中完成)语言可能要干净得多。是的,Jon我同意。不幸的是,一个系统生成的文件名为“今天”,另一个系统生成的文件名为“昨天”。然而,这两个系统都与许多生成和使用这些文件的其他系统交互,只有一个这样的情况会导致问题。@Ron:我不明白为什么这意味着ns您必须使用批处理文件来解决问题,而不是(比如)一个小小的.NET控制台应用程序(或者Python脚本,或者Perl脚本,等等)@乔恩:是的。我会找到那些真正运行这些东西的人,并找出那台机器能处理什么。这很酷。我必须调整格式,否则它会工作得很好。如果目标机器上的本地设置与我的设置不同,它能处理吗?不,它不能处理本地设置
   @ECHO off
   SETLOCAL
   :: DateMath, a general purpose date math routine

   :: If DateMath detects an error, variable _dd_int is set to 999999.
   SET v_dd_int=0
   SET v_mm_int=0 
   SET v_yy_int=0
   SET v_ymd_str=
   SET v_mm_str=
   SET v_dd_str=

   IF "%3"=="" goto s_syntax
   IF "%4"=="+" goto s_validate_year
   IF "%4"=="-" goto s_validate_year
   IF "%4"=="" goto s_validate_year

   :s_syntax
   echo:
   echo DATEMATH SYNTAX:
   echo _______________
   echo:
   echo DateMath will set the variables as listed below
   echo 'str' variables include leading zeros e.g. "01"
   echo 'int' variables leading zeros are stripped e.g. "1"
   echo:
   echo CALL DateMath YY MM DD - YY2 MM2 DD2 
   echo:
   echo Will set variable _dd_int to the signed difference
   echo between the 2 dates (measured in days)
   echo:
   echo:
   echo CALL DateMath YY MM DD +/- Days 
   echo:
   echo Will set the following variables to the result of 
   echo adding or substracting days from the initial date:
   echo    _ymd_str, _yy_int
   echo    _mm_str, _mm_int,
   echo    _dd_str, _dd_int
   echo:
   echo:
   echo ___________________________________
   pause

   echo:
   echo:
   echo CALL DateMath YY MM DD
   echo:
   echo Will set the following variables:
   echo    _ymd_str, _yy_int
   echo    _mm_str, _mm_int,
   echo    _dd_str, _dd_int
   echo:
   echo ___________________________________
   echo:
   echo _ymd_str is in YYYYMMDD format.
   echo:
   echo _yy_int is in YYYY format, even if YY format was originally supplied.
   echo This conversion is useful for FAT/NTFS file dates which are in YY format.
   echo:

   ENDLOCAL & SET /a _dd_int=999999
   goto :eof

   :s_validate_year
   ::strip leading zeros
    SET v_yy=%1
    if %v_yy:~0,1% EQU 0 set v_yy=%v_yy:~1%

    :: Check for Y2K
    IF %v_yy% LSS 100 IF %v_yy% GEQ 80 SET /A v_yy += 1900
    IF %v_yy% LSS 80 SET /A v_yy += 2000

    :: at this point v_yy contains a 4 digit year

   ::validate month and day
    if %2 GTR 12 goto s_syntax
    if %3 GTR 31 goto s_syntax

    SET v_mm=%2
    SET v_dd=%3

    ::strip leading zeros
    if %v_mm:~0,1% EQU 0 set v_mm=%v_mm:~1%
    if %v_dd:~0,1% EQU 0 set v_dd=%v_dd:~1%

   :: Set the int variables
    SET /a v_dd_int=%v_dd%
    SET /a v_yy_int=%v_yy%
    SET /a v_mm_int=%v_mm%

   :: Determine which function to perform - ADD, SUBTRACT or CONVERT

    If not "%6"=="" goto s_validate_2nd_date 
    if "%4"=="" goto s_convert_only

   :: Add or subtract  days to a date
    SET /a v_number_of_days=%5
    goto s_add_or_subtract_days

   :s_convert_only

    SET /a v_dd_int=%v_dd%
    IF %v_dd% LEQ 9 (SET v_dd_str=0%v_dd%) ELSE (SET v_dd_str=%v_dd%)
    IF %v_mm% LEQ 9 (SET v_mm_str=0%v_mm%) ELSE (SET v_mm_str=%v_mm%)
    SET v_ymd_str=%v_yy%%v_mm_str%%v_dd_str%

   ECHO DATEMATH - Convert date only (no maths)
   goto s_end
   ::::::::::::::::::::::::::::::::::::::::::::::::::

   :s_validate_2nd_date
    If "%4"=="+" goto s_syntax
    :: Subtracting one date from another ::::::
    :: strip leading zero
    SET v_yy2=%5
    if %v_yy2:~0,1% EQU 0 set v_yy2=%v_yy2:~1%

    if %v_yy2% GTR 99 goto s_validate2nd_month
    if %v_yy2% GTR 49 goto s_prefix_2_1950_1999
    if %v_yy2% LSS 10 goto s_prefix_2_2000_2009
    SET v_yy2=20%v_yy2%
    goto s_validate2nd_month

   :s_prefix_2_2000_2009
    SET v_yy2=200%v_yy2%
    goto s_validate2nd_month

   :s_prefix_2_1950_1999
    SET v_yy2=19%v_yy2%

   :s_validate2nd_month
    ::strip leading zeros
    ::SET /a v_yy2=%v_yy2%
    if %v_yy2:~0,1% EQU 0 set v_yy2=%v_yy2:~1%
    ::v_yy2 now contains a 4 digit year

    if %6 GTR 12 goto s_syntax
    SET v_mm2=%6

    if %7 GTR 31 goto s_syntax
    SET v_dd2=%7

    ::strip leading zeros
    ::SET /a v_mm2=%v_mm2%
    if %v_mm2:~0,1% EQU 0 set v_mm2=%v_mm2:~1%
    ::SET /a v_dd2=%v_dd2%
    if %v_dd2:~0,1% EQU 0 set v_dd2=%v_dd2:~1%

   call :s_julian_day %v_yy_int% %v_mm_int% %v_dd_int%
   SET v_sumdays1=%v_JulianDay%

   call :s_julian_day %v_yy2% %v_mm2% %v_dd2%
   SET v_sumdays2=%v_JulianDay%

   SET /a v_dd_int=%v_sumdays1% - %v_sumdays2%

   ECHO DATEMATH - Subtracting one date from another = days difference
   ECHO ~~~~~~
   ECHO %v_dd_int%
   ECHO ~~~~~~
   goto s_end_days
   ::::::::::::::::::::::::::::::::::::::::::::::::::

   :s_add_or_subtract_days
   if /i "%4"=="+" goto s_add_up_days

   :: Subtract all days ::::::
   SET /a v_dd=%v_dd% - %v_number_of_days%

   :s_adjust_month_year
   if %v_dd% GEQ 1 goto s_add_subtract_days_DONE
   SET /a v_mm=%v_mm% - 1
   if %v_mm% GEQ 1 goto s_add_days_%v_mm%
   SET /a v_yy=%v_yy% - 1
   SET /a v_mm=%v_mm% + 12
   goto s_add_days_%v_mm%

   :s_add_days_2
   SET /a v_dd=%v_dd% + 28
   SET /a v_leapyear=%v_yy% / 4
   SET /a v_leapyear=%v_leapyear% * 4
   if %v_leapyear% NEQ %v_yy% goto s_adjust_month_year
   SET /a v_dd=%v_dd% + 1
   goto s_adjust_month_year

   :s_add_days_4
   :s_add_days_6
   :s_add_days_9
   :s_add_days_11
   SET /a v_dd=%v_dd% + 30
   goto s_adjust_month_year

   :s_add_days_1
   :s_add_days_3
   :s_add_days_5
   :s_add_days_7
   :s_add_days_8
   :s_add_days_10
   :s_add_days_12
   SET /a v_dd=%v_dd% + 31
   goto s_adjust_month_year

   :s_add_up_days
   :: add all days ::::::
   SET /a v_dd=%v_dd% + %v_number_of_days%

   :s_subtract_days_
   goto s_subtract_days_%v_mm%

   :s_adjust_mth_yr
   SET /a v_mm=%v_mm% + 1
   if %v_mm% LEQ 12 goto s_subtract_days_%v_mm%
   SET /a v_yy=%v_yy% + 1
   SET /a v_mm=%v_mm% - 12
   goto s_subtract_days_%v_mm%

   :s_subtract_days_2
   SET /a v_leapyear=%v_yy% / 4
   SET /a v_leapyear=%v_leapyear% * 4
   If %v_leapyear% EQU %v_yy% goto s_subtract_leapyear

   if %v_dd% LEQ 28 goto s_add_subtract_days_DONE
   SET /a v_dd=%v_dd% - 28
   goto s_adjust_mth_yr

   :s_subtract_leapyear
   if %v_dd% LEQ 29 goto s_add_subtract_days_DONE
   SET /a v_dd=%v_dd% - 29
   goto s_adjust_mth_yr

   :s_subtract_days_4
   :s_subtract_days_6
   :s_subtract_days_9
   :s_subtract_days_11
   if %v_dd% LEQ 30 goto s_add_subtract_days_DONE
   SET /a v_dd=%v_dd% - 30
   goto s_adjust_mth_yr

   :s_subtract_days_1
   :s_subtract_days_3
   :s_subtract_days_5
   :s_subtract_days_7
   :s_subtract_days_8
   :s_subtract_days_10
   :s_subtract_days_12
   if %v_dd% LEQ 31 goto s_add_subtract_days_DONE
   SET /a v_dd=%v_dd% - 31
   goto s_adjust_mth_yr

   :s_add_subtract_days_DONE
   SET /a v_dd_int=%v_dd%
   SET /a v_mm_int=%v_mm%
   SET /a v_yy_int=%v_yy%
   IF %v_dd% GTR 9 (SET v_dd_str=%v_dd%) ELSE (SET v_dd_str=0%v_dd%)
   IF %v_mm% GTR 9 (SET v_mm_str=%v_mm%) ELSE (SET v_mm_str=0%v_mm%)
   SET v_ymd_str=%v_yy%%v_mm_str%%v_dd_str%

   ECHO DATEMATH - add or subtract days from a date = new date
   goto s_end
   ::::::::::::::::::::::::::::::::::::::::::::::::::

   :s_julian_day
   SET v_year=%1
   SET v_month=%2
   SET v_day=%3

   SET /a v_month=v_month
   SET /a v_day=v_day

   SET /A a = 14 - v_month
   SET /A a /= 12
   SET /A y = v_year + 4800 - a
   SET /A m = v_month + 12 * a - 3
   SET /A m = 153 * m + 2
   SET /A m /= 5
   SET /A v_JulianDay = v_day + m + 365 * y + y / 4 - y / 100 + y / 400 - 32045

   ECHO The Julian Day is [%v_JulianDay%]
   goto :eof
   ::::::::::::::::::::::::::::::::::::::::::::::::::

   :s_end
   ECHO ~~~~~~~~~~~~
   ECHO [%v_ymd_str%] YY=[%v_yy_int%] MM=[%v_mm_str%] DD=[%v_dd_str%]
   ECHO ~~~~~~~~~~~~
   :s_end_days
   ENDLOCAL&SET /a _yy_int=%v_yy_int%&SET /a _mm_int=%v_mm_int%&SET /a _dd_int=%v_dd_int%&SET _ymd_str=%v_ymd_str%&SET _mm_str=%v_mm_str%&SET _dd_str=%v_dd_str%
  @if (@X) == (@Y) @end /* JScript comment 
    @echo off   
    cscript //E:JScript //nologo "%~f0" %*
    exit /b %errorlevel%       
@if (@X)==(@Y) @end JScript comment */

var days=parseInt(WScript.Arguments.Item(0));


Date.prototype.addDays = function(days) {
    var date = new Date(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
}

var date = new Date();

WScript.Echo(date.addDays(5));
WScript.Echo("Year: " + date.getFullYear());
WScript.Echo("Month: " + date.getMonth());
WScript.Echo("DayOfTeWEek: " + date.getDay());
E:\scripts>dayAdder.bat 7
Sun Nov 8 16:27:48 UTC+0200 2020
Year: 2020
Month: 10
DayOfTeWEek: 2
DayOfTheMonth: 3