【问题标题】:Date arithmetic in cmd scriptingcmd脚本中的日期算术
【发布时间】:2010-09-26 04:57:55
【问题描述】:

我需要编写一个脚本来将文件名从 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

但我不知道如何做日期 -1 的事情(除了长篇大论)从一天中减去 1,如果那是 = 0,那么从月份中减去一个并将天 = 设置为的最后一天新的月份等等。

有什么想法吗?

【问题讨论】:

  • 即使是上面获取日期的例子也有点啰嗦:(
  • 这绝对必须在一个直接的批处理文件中完成吗?用几乎任何“正确”的语言来做这件事可能会更干净。
  • 是的,乔恩,我同意。不幸的是,问题是一个系统生成名称为“今天”的文件,而另一个系统将它们用于“昨天”。然而,这两个系统都与生成和使用这些文件的许多其他系统交互,并且只有一个这样的情况会导致问题。
  • @Ron:我不明白为什么这意味着您必须使用批处理文件而不是(比如说)一个小型 .NET 控制台应用程序来解决问题。 (或 Python 脚本。或 Perl 脚本等)
  • @Jon:是的。我会找到实际运行这些东西的人,并找出这台机器可以处理什么。

标签: date batch-file cmd scripting


【解决方案1】:

可以通过将 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());

示例和输出:

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

您可以以适合您的方式对其进行修改。

【讨论】:

    【解决方案2】:

    在 ss64.com 上找到此脚本:https://ss64.com/nt/syntax-datemath.html(许可证:https://ss64.com/docs/copyright.html

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

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

    set YY=%date:~-4,4%
    set MM=%date:~-7,2%
    set DD=%date:~-10,2
    call datemath.bat %YY% %MM% %DD% - 1
    echo year=%_yy_int%, month=%_mm_int%, day=%_dd_int%
    echo padded date:%_ymd_str%, padded month:%_mm_str%, padded day:%_dd_str%
    

    脚本:

       @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%
    

    【讨论】:

    • 好的,所以这行得通,但是我发现的问题是没有填充个位数的月份。如果运行 -90,它会返回 201996 的日期,而应该是 20190906。您是否遇到过类似的问题?
    • 没关系,发现这个脚本效果更好powershell get-date((get-date).addDays(-1)) -format yyyyMMdd
    • 如果你想要填充值,你应该使用 %_ymd_str%、%_mm_str% 和 %_dd_str% 变量。 %_mm_int% 和 %_dd_int% 包含未填充的整数值。我已经编辑了答案以添加这种可能性。
    • 我会试试看,但请参阅 This link 它做的一切都更整洁。
    【解决方案3】:

    使用 Windows 批处理脚本轻松添加或减去日期

    这是我提出的使用批处理脚本计算日期(加法或减法)的解决方案。根据您的需要相应地设置变量,然后根据您的需要调整逻辑。这非常适合我的需求,并且全部包含在同一个批处理脚本中,没有太多逻辑。

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

    重要提示:似乎五个 9 (99999) 是用 MinusDays= 值减去时对批处理脚本的限制。在添加 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
    

    更多资源

    【讨论】:

      【解决方案4】:

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

      :: 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 或更高效的东西,我仍然可以从批处理中合并或调用以动态计算日期。

      【讨论】:

        【解决方案5】:

        我需要在检查闰年等时从当前日期减去天数的东西,这很好用。

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

        以下是示例:

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

        IF "%1"=="" goto modifydate
        
        :modifydate
        SET subtractdays=5
        SET ModDateScript=\\servershare\path\Called_Scripts\ModDate.cmd
        CALL "%ModDateScript%" %subtractdays% "%~fnx0"
        

        脚本将计算 %moddate% 参数并将其传回给原始调用脚本,以将其设置为变量,以便它进行相应的处理。您只需将其放在您调用的脚本末尾即可从当前日期 (ModDate.cmd) 中修改/减去天数。

        SET moddate=%mm%/%dd%/%yyyy%
        Call %2 %moddate%
        GOTO EOF
        

        我能够测试并确定发布的原始脚本中的这些行:

        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")
        

        请解释一下这些行(我用 and 语句更改为一行)无论如何都做了什么,因为我无法快速区分测试。我减去回到 19 世纪,这对我来说似乎是准确的。我想也许它有助于处理修改后的年份小于 2000 的计算——但除非我遗漏了什么,否则我看不到这一点。

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

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

        谢谢, P

        【讨论】:

          【解决方案6】:

          你必须以困难的方式去做。我建议使用 SteveGTR 的this 解决方案。我复制下面的文字,因为至少我不能总是在那个网站上看到解决方案。


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

          @echo off
          
          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
          
          set CurDate=%mm%/%dd%/%yyyy%
          
          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 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
          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=%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%
          

          祝你好运, 史蒂夫

          【讨论】:

          • 这很酷。我将不得不调整格式,否则效果很好。如果目标机器上的 localSettings 与我的设置不同怎么办?
          • 不,它不能正确处理本地设置。在我需要批处理文件中的当前日期/时间的地方,我使用外部程序来获取日期,而不管本地设置如何......
          猜你喜欢
          • 2011-07-21
          • 1970-01-01
          • 2011-10-05
          • 1970-01-01
          • 1970-01-01
          • 2017-08-23
          • 2011-02-23
          • 1970-01-01
          • 2019-12-16
          相关资源
          最近更新 更多