1

Тема: CMD/BAT: Получения даты двухнедельной давности

Здравствуйте.
Столкнулся с необходимостью вычисления даты двухнедельной давности.
К сожалению пока опыта мало, код тупой, но почти едет.

set Day=%date:~0,2%
set Month=%date:~3,2%
set Year=%date:~-4%
set /a Day=%Day%-14
if %Day% lss 0 (set /a Month=%Month%-1
                if %Month% equ 01 (set /a Day=%Day%+31)
                if %Month% equ 03 (set /a Day=%Day%+31)
                if %Month% equ 05 (set /a Day=%Day%+31)
                if %Month% equ 07 (set /a Day=%Day%+31)
                if %Month% equ 08 (set /a Day=%Day%+31)
                if %Month% equ 10 (set /a Day=%Day%+31)
                if %Month% equ 12 (set /a Day=%Day%+31)
 
                if %Month% equ 04 (set /a Day=%Day%+30)
                if %Month% equ 06 (set /a Day=%Day%+30)
                if %Month% equ 09 (set /a Day=%Day%+30)
                if %Month% equ 11 (set /a Day=%Day%+30)

                if %Month% equ 02 (if %Year% equ 2012 (set /a Day=%Day%+29)
                                   if %Year% equ 2016 (set /a Day=%Day%+29)
                                   if %Year% equ 2020 (set /a Day=%Day%+29)
                                   else (set /a Day=%Day%+28)
                                  )
               )

Проблема в том что двузначные которые должны иметь вид 0X получаются вида X.
Подскажите как подправить, или может более простой способ решения данной задачи.
Заранее большое спасибо!

2 (изменено: werthk, 2012-10-15 08:09:48)

Re: CMD/BAT: Получения даты двухнедельной давности

Взято с http://forum.oszone.net/post-1203277.html

Выкинул что мне не нужно.

@Echo Off
Set $OLD=25
:: Находим текущие день/месяц/год
For /F "Tokens=1" %%i In ('WMIC OS Get LocalDateTime^,Version^|Find "."') Do Set DateTime=%%i
Set $Y=%DateTime:~0,4%
If "%DateTime:~4,1%"=="0" (Set $M=%DateTime:~5,1%) Else (Set $M=%DateTime:~4,2%)
If "%DateTime:~6,1%"=="0" (Set $D=%DateTime:~7,1%) Else (Set $D=%DateTime:~6,2%)
:: Откатываем дату назад на $OLD дней
Call :GetOldDate %$OLD%
:: Выход
EXIT

:GetOldDate
:: -----------------------------------
:: Расчет даты, предшествующей текущей
:: заданное количество дней (< 29)
:: -----------------------------------
 Set /A $D -= %1
 If %$D% GTR 0 GoTo GetOldDate_2
:: Месяц, год, дней в месяце
 Set /A $M=%$M%+11-((%$M%+10)/12)*12
 If %$M% EQU 12 Set /A $Y-=1
 For /F "Tokens=%$M%" %%i In ("31 28 31 30 31 30 31 31 30 31 30 31") Do Set $X=%%i
 If %$M% NEQ 2 GoTo GetOldDate_1
:: Февраль високосного года
 Set /A $B1=%$Y%-(%$Y%/4)*4
 Set /A $B2=%$Y%-(%$Y%/100)*100
 Set /A $B3=%$Y%-(%$Y%/400)*400
 If 0 EQU %$B1% If 0 NEQ %$B2% Set /A $X+=1
 If 0 EQU %$B3% Set /A $X+=1
:: День месяца
:GetOldDate_1
 Set /A $D=%$D%+%$X%-((%$D%+%$X%-1)/%$X%)*%$X%
:: Форматирование даты
:GetOldDate_2
 Set $M=0%$M%&Set $D=0%$D%
 Set $M=%$M:~-2%&Set $D=%$D:~-2%
 Set DateTime=%$Y%%$M%%$D%%DateTime:~8%
GoTo :EOF

3

Re: CMD/BAT: Получения даты двухнедельной давности

Если с помощью скрипта, который сам создаётся из батника, гораздо кошернее получается.

4

Re: CMD/BAT: Получения даты двухнедельной давности

forfiles

Я конечно далек от мысли... (с)