9
votes

Console de Windows% Date% mathématiques

Je voudrais définir la date dans un fichier de lots de Windows à 7 jours à partir d'aujourd'hui. Je voudrais le faire dans le format suivant.

set today=%date:~10,4%-%date:~4,2%-%date:~-7,2%


6 Réponses :


19
votes

J'ai posté la description ci-dessous sur certains sites il y a quelque temps:


Les fichiers de lots suivants convertissent de la date à la date de jour Julian Un vicefersa: p>

DateTojulian.bat: P> xxx pré>

juliantodate.bat: p> xxx pré>

de cette façon, pour ajouter / soustraire un nombre de jours à une date Utilisez les lignes suivantes:

CALL DATETOJULIAN %DATE%
SET /A NEWDATE=JDN+DAYS
CALL JULIANTODATE %NEWDATE%


0 commentaires

0
votes

Adametrada a demandé à propos des dates de soustraire. J'ai eu un temps difficile soustrayant deux dates de Julian à cause de la setlocal dans les fonctions Julian. Je l'ai fait en appelant une fonction.

Appel: Sub_Julien! Julian! % Aujourd'hui_julian%

: Sub_Julians

set / a delta_dates =% ~ 1-% ~ 2

...

GOTO: EOF :: FIN: AGE_OF_EPSDATE


0 commentaires

0
votes

OK, j'avais besoin d'un fichier de commandes pour afficher le Jday actuel pour un centre d'opérations DOD. Vous pouvez double-cliquer sur le fichier et il s'affichera dans une fenêtre CMD. Ensuite, appuyez sur n'importe quelle touche pour quitter.

Voici ce que j'ai proposé: P>

@echo off
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value')     do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set     "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"

:: Call the day ordinal number subroutine
call :JDdayNumber %DD% %MM% %YYYY% DayOrdinalNumber

:: Display the result
echo.
echo Today is JDay %DayOrdinalNumber%
echo.
pause,
endlocal & goto :EOF

:: set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%"
:: set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"
:: echo datestamp: "%datestamp%"
:: echo timestamp: "%timestamp%"
:: echo fullstamp: "%fullstamp%"

:: ============================================================
:: Subroutine: Calculate a day's ordinal number within the year
::JDdayNumber day month year return_
setlocal enableextensions enabledelayedexpansion
if %2 LEQ 2 (
set /a f=%1-1+31*^(%2-1^)
) else (
set /a a=%3
set /a b=!a!/4-!a!/100+!a!/400
set /a c=^(!a!-1^)/4-^(!a!-1^)/100+^(!a!-1^)/400
set /a s=!b!-!c!
set /a f=%1+^(153*^(%2-3^)+2^)/5+58+!s!
)
set /a return_=%f%+1
endlocal & set "%4=%return_%" & goto :EOF


0 commentaires

0
votes

J'ai refactore le code du Jdate code> et gdate code> des sous-routines un peu de http://www.robvanderwoude.com/datetimentmath.php .

Utilisation Exemple: H1>
@echo off

call :main %*
goto :eof

:main
    setlocal

    call :initialize "2017-01-01" "1"

    endlocal
    goto :eof

:initialize
    setlocal
    set "previousDate=%~1"
    set /a "numberOfDays=%~2"

    set /p "previousDate=Enter ISO date: "
    set /p "numberOfDays=Enter number of days to add: "

    set "currentDate="
    call :addIsoDateDays "%previousDate%" "%numberOfDays%" currentDate

    echo %previousDate% + %numberOfDays% days = %currentDate%

    echo.

    call :initialize "%currentDate%" "%numberOfDays%"

    endlocal
    goto :eof

:stripLeadingZero
    setlocal
    set "number=%~1"
    if %number:~0,1% equ 0 (
        set "number=%number:~1%"
    )
    (
        endlocal
        set "%~2=%number%"
    )
    goto :eof

:addLeadingZero
    setlocal
    set "number=%~1"
    if %number% lss 10 (
        set "number=0%number%"
    )
    (
        endlocal
        set "%~2=%number%"
    )
    goto :eof

:gregorianToJulianDate
    setlocal
    set "gregorianYear=%~1"
    set "gregorianMonth=%~2"
    set "gregorianDay=%~3"

    call :stripLeadingZero "%gregorianMonth%" gregorianMonth
    call :stripLeadingZero "%gregorianDay%" gregorianDay

    set /a "julianYear=(%gregorianYear% + 4800)"
    set /a "julianMonth=((%gregorianMonth% - 14) / 12)"
    set /a "julianDate=((1461 * (%julianYear% + %julianMonth%) / 4) + (367 * (%gregorianMonth% - 2 - (12 * %julianMonth%)) / 12) - ((3 * ((%julianYear% + %julianMonth% + 100) / 100)) / 4) + (%gregorianDay% - 32075))"

    (
        endlocal
        set "%~4=%julianDate%"
    )
    goto :eof

:isoToJulianDate
    setlocal
    set "date=%~1"
    set "year="
    set "month="
    set "day="

    for /f "tokens=1-3 delims=-" %%a in ("%date%") do (
        set "year=%%a"
        set "month=%%b"
        set "day=%%c"
    )

    set /a "julianDate=0"
    call :gregorianToJulianDate "%year%" "%month%" "%day%" julianDate

    (
        endlocal
        set "%~2=%julianDate%"
    )
    goto :eof

:julianToGregorianDate
    setlocal
    set /a "julianDate=%~1"

    set /a "p=(%julianDate% + 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 "gregorianYear=((100 * (%q% - 49)) + %s% + %v%)"
    set /a "gregorianMonth=(%u% + 2 - (12 * %v%))"
    set /a "gregorianDay=(%t% - (2447 * %u% / 80))"

    call :addLeadingZero "%gregorianMonth%" gregorianMonth
    call :addLeadingZero "%gregorianDay%" gregorianDay

    (
        endlocal
        set "%~2=%gregorianYear%"
        set "%~3=%gregorianMonth%"
        set "%~4=%gregorianDay%"
    )
    goto :eof

:julianToIsoDate
    setlocal
    set /a "julianDate=%~1"

    set "year="
    set "month="
    set "day="

    call :julianToGregorianDate "%julianDate%" year month day

    set "isoDate=%year%-%month%-%day%"

    (
        endlocal
        set "%~2=%isoDate%"
    )
    goto :eof

:addIsoDateDays
    setlocal
    set "previousIsoDate=%~1"
    set /a "numberOfDays=%~2"

    set /a "previousJulianDate=0"
    call :isoToJulianDate "%previousIsoDate%" previousJulianDate

    set /a "currentJulianDate=(%previousJulianDate% + %numberOfDays%)"

    set "currentIsoDate="
    call :julianToIsoDate "%currentJulianDate%" currentIsoDate

    (
        endlocal
        set "%~3=%currentIsoDate%"
    )
    goto :eof


0 commentaires

-1
votes

Une option plus simple consiste à appeler une commande PowerShell à partir de votre script de lot pour manipuler la date. Le script de lot peut définir la date à 7 jours dans le passé avec une seule ligne.

set /p Today=<captureVar


0 commentaires

0
votes

Il y a une réponse avec Calling PowerShell. Bien qu'il y ait des machines toujours en cours d'exécution sans PowerShell installé (au moment de la rédaction de ce XP, Vista, Windows7, Windows2003 et Windows2008 ont toujours une action d'OS de descente et arrivent sans PowerShell installé)

Autre option utilisera Jscript dans une batte Script p>

voici le dayadder.bat code> qui accepte un seul argument - les jours que vous souhaitez ajouter à la date actuelle et imprime le résultat: P>

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


0 commentaires