如何在batch file中获取昨天的date

我知道如何在Windows 7中获得今天的date。下面是我正在使用的命令:

%DATE:~6,4%%DATE:~3,2%%DATE:~0,2% 

但是我想得到昨天,我不知道如何。

如果你只限于cmd.exe ,那么其他解决方案,尽管它们的大小,可能是你会得到的好。 但是,现代Windows(例如Win7)附带了很多其他工具,可以使工作变得更容易。

只需按如下所示创建一个VBScript yester.vbs脚本:

 d = date() - 1 wscript.echo year(d) * 10000 + month(d) * 100 + day(d) 

然后你可以从你的cmd脚本中调用它:

 for /f %%a in ('cscript //nologo yester.vbs') do set yesterday=%%a 

yesterday变量将以yyyymmdd的形式创建,供您操作,但是您的愿望。

找到一个脚本,将确保您获得前一天即使年份或月份更改昨天批次 。

 @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% REM Set IIS and AWS date variables set IISDT=%yyyy:~2,2%%mm%%dd% set AWSDT=%yyyy%-%mm%-%dd% 
 @echo off :: Strip the day of the week from the current date FOR %%A IN (%Date%) DO SET Today=%%A :: Parse the date, prefix day and month with an extra leading zero FOR /F "tokens=1-3 delims=/" %%A IN ("%Today%") DO ( SET Day=0%%A SET Month=0%%B SET Year=%%C ) :: Remove excess leading zeroes SET Day=%Day:~-2% SET Month=%Month:~-2% :: Display the results SET Day SET Month SET Year :: Convert to Julian date CALL :JDate %Year% %Month% %Day% :: Display the result SET JDate :: Subtract 1 day SET /A JPast = JDate - 1 :: Display the result SET JPast :: Convert back to "normal" date again CALL :GDate %JPast% :: Display the result ::SET GDate=20130121 SET GDate echo The previous day in form YYYYMMDD is %GDate% pause :::::::::::::::::::::::::::::::::::::::::::::::::::::: GOTO:EOF :JDate :: Convert date to Julian :: Arguments : YYYY MM DD :: Returns : Julian date :: :: First strip leading zeroes SET MM=%2 SET DD=%3 IF %MM:~0,1% EQU 0 SET MM=%MM:~1% IF %DD:~0,1% EQU 0 SET DD=%DD:~1% :: :: Algorithm based on Fliegel-Van Flandern :: algorithm from the Astronomical Almanac, :: provided by Doctor Fenton on the Math Forum :: (http://mathforum.org/library/drmath/view/51907.html), :: and converted to batch code by Ron Bakowski. SET /A Month1 = ( %MM% - 14 ) / 12 SET /A Year1 = %1 + 4800 SET /A JDate = 1461 * ( %Year1% + %Month1% ) / 4 + 367 * ( %MM% - 2 -12 * % Month1% ) / 12 - ( 3 * ( ( %Year1% + %Month1% + 100 ) / 100 ) ) / 4 + %DD% - 32075 SET Month1= SET Year1= GOTO:EOF :GDate :: Convert Julian date back to "normal" Gregorian date :: Argument : Julian date :: Returns : YYYY MM DD :: :: Algorithm based on Fliegel-Van Flandern :: algorithm from the Astronomical Almanac, :: provided by Doctor Fenton on the Math Forum :: (http://mathforum.org/library/drmath/view/51907.html), :: and converted to batch code by Ron Bakowski. :: SET /AP = %1 + 68569 SET /AQ = 4 * %P% / 146097 SET /AR = %P% - ( 146097 * %Q% +3 ) / 4 SET /AS = 4000 * ( %R% + 1 ) / 1461001 SET /AT = %R% - 1461 * %S% / 4 + 31 SET /AU = 80 * %T% / 2447 SET /AV = %U% / 11 SET /A GYear = 100 * ( %Q% - 49 ) + %S% + %V% SET /A GMonth = %U% + 2 - 12 * %V% SET /A GDay = %T% - 2447 * %U% / 80 :: Clean up the mess FOR %%A IN (PQRSTUV) DO SET %%A= :: Add leading zeroes IF 1%GMonth% LSS 20 SET GMonth=0%GMonth% IF 1%GDay% LSS 20 SET GDay=0%GDay% :: Return value :: Here you can define the form that you want SET GDate=%GYear%%GMonth%%GDay% GOTO:EOF 

这里有一个解决方案,可以即时创建earlierday.vbs文件,然后使用它并删除它。

它将结果存储在NewDate变量中

此示例计算1天前,但可以通过更改Offset变量的值来轻松计算日期。

 @echo off set Offset=1 echo d = date() - WScript.Arguments.Item(0) > earlierday.vbs echo wscript.echo year(d) * 10000 + month(d) * 100 + day(d) >> earlierday.vbs for /f %%a in ('cscript //nologo earlierday.vbs %Offset%') do set NewDate=%%a del earlierday.vbs echo %NewDate% pause 

您可以通过使用%temp%\ earlierday.vbs来稍微改善这一点,以在用户的​​临时文件夹中创建该文件。

感谢paxdiablo,因为这是对他之前发表的一个简单的调整。

编辑:这是一个循环的东西,接近我真正需要它做的。 这将需要14天的日期,并返回该日期。 然后它会一直保持7天,直到一天到达35天。

 @echo off SETLOCAL EnableDelayedExpansion set BackDaysFrom=14 Set BackDaysTo=35 Set BackDaysStep=7 echo d = date() - WScript.Arguments.Item(0) > earlierday.vbs echo wscript.echo year(d) * 10000 + month(d) * 100 + day(d) >> earlierday.vbs for /L %%i in (%BackDaysFrom%, %BackDaysStep%, %BackDaysTo%) do ( for /f %%a in ('cscript //nologo earlierday.vbs %%i') do set NewDate=%%a echo !NewDate! ) del earlierday.vbs pause