2012-08-09 14 views
6

मुझे पता है कि विंडोज 7 यहाँ में आज की तारीख पाने के लिए कल की तारीख पाने के लिए आदेश है कि मैं का उपयोग कर रहा है:कैसे एक बैच फ़ाइल

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

लेकिन मैं कल प्राप्त करना चाहते हैं, मैं नहीं जानता कि किस तरह।

+0

http://www.robvanderwoude.com/datetimentmath.php – craig65535

+1

2 लिंक जब 'googling डॉस कल date': http://www.binbert.com/blog/2010/07/previous-yesterdays- डेट-इन-डॉस-बैच-फ़ाइल/ – SeanC

+0

पहला लिंक जब गुमलिंग दिनांक घटाव बैच फ़ाइल: http://stackoverflow.com/questions/355425/date-arithmetic-in-dos-scripting – Andrew

उत्तर

6

एक ऐसी स्क्रिप्ट मिली जो यह सुनिश्चित करने के लिए काम करेगी कि आपको पिछले दिन मिल जाए, भले ही वर्ष या महीना Dos Yesterday Batch बदल जाए।

@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% 
3
@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 /A P  = %1 + 68569 
SET /A Q  = 4 * %P%/146097 
SET /A R  = %P% - (146097 * %Q% +3)/4 
SET /A S  = 4000 * (%R% + 1)/1461001 
SET /A T  = %R% - 1461 * %S%/4 + 31 
SET /A U  = 80 * %T%/2447 
SET /A V  = %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 (P Q R S T U V) 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 
9

आप तक ही सीमित रहे हैं सिर्फcmd.exe, तो अन्य समाधान, उनके आकार के बावजूद, शायद के रूप में अच्छा के रूप में आप मिल जाएगा रहे हैं। हालांकि, आधुनिक विंडोज (जैसे आपका विन 7) जहाज कुछ अन्य उपकरण हैं जो नौकरी को कहीं अधिक आसान कर सकते हैं।

इस प्रकार बस एक 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 में बनाया जाएगा हालांकि आप चाहें हेरफेर करने के लिए।

1

यहां एक समाधान है जो फ्लाई पर firstday.vbs फ़ाइल बनाता है, इसका उपयोग करता है और बाद में इसे हटा देता है।

यह NewDate चर

इस उदाहरण की गणना करता है में परिणाम संग्रहीत करता है 1 दिन पहले, लेकिन आसानी से आगे वापस ऑफसेट चर का मान बदल कर एक तारीख की गणना कर सकते हैं।

@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 

आप उपयोगकर्ता के अस्थायी फ़ोल्डर में फ़ाइल बनाने के लिए% अस्थायी% \ earlierday.vbs का उपयोग करके थोड़ा इस परिशोधित कर सकते हैं।

क्रेडिट्स के रूप में क्रेडिट्स क्योंकि यह उनकी पिछली पोस्ट पर एक साधारण ट्विक है।

संपादित करें: यहां एक लूप के साथ कुछ है, जो मुझे वास्तव में करने की आवश्यकता है उसके करीब है। इसमें आज की तारीख से 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