четверг, 5 сентября 2013 г.

Вычисление предыдущей даты в командной строке Windows


Частенько бывает нужно для административных задач, например, скопировать файлы изменившиеся вчера.

@echo off
for /f "skip=2 tokens=2*" %%i in ('reg QUERY "HKCU\Control Panel\International" /v sDate') do set sdate=%%j
for /f "delims=%sdate% tokens=1,2,3" %%i in ("%DATE%") do call :getpackage %%i %%j %%k

rem :: проверочка
rem echo %year%
rem echo %month%
rem echo %day%
echo %package%

rem :: тут можно поместить необходимые нам команды

goto :EOF
:getpackage
set day=%1
set month=%2
set /a year=%3
set lastdays="31 28 31 30 31 30 31 31 30 31 30 31"
if %day% leq 9 set /a day=%day:~-1%
if %month% leq 9 set /a month=%month:~-1%
set /a day-=1
if "%day%"=="0" set /a month-=1
if "%month%"=="0" set /a month=12,year-=1
set /a isleap="(year%%4)&((year%%100)|(year%%400))"
if "%isleap%"=="0" set lastdays=%lastdays:28=29%
if "%day%"=="0" for /f "tokens=%month%" %%i in (%lastdays%) do set day=%%i
if %day% leq 9 set day=0%day%
if %month% leq 9 set month=0%month%
set package=%month%-%day%-%year%
goto :EOF


Код не мой, но более правильного решения я не нашел.

1 комментарий:

  1. Немного (на мой взгляд) упростил и добавил два параметра при вызове getpackage: четвертый - знак плюс или минут (прибавляем или отнимаем дни), пятый - количество прибавляемых или отнимаемых дней от текущей даты

    @echo off
    call :getpackage %date:~0,2% %date:~3,2% %date:~6,4% + 3

    echo %package%

    rem :: тут можно поместить необходимые нам команды

    goto :EOF
    :getpackage
    set day=%1
    set month=%2
    set /a year=%3
    set lastdays="31 28 31 30 31 30 31 31 30 31 30 31"
    if %day% leq 9 set /a day=%day:~-1%
    if %month% leq 9 set /a month=%month:~-1%
    set /a day%4=%5
    if "%day%"=="0" set /a month-=1
    if "%month%"=="0" set /a month=12,year-=1
    set /a isleap="(year%%4)&((year%%100)|(year%%400))"
    if "%isleap%"=="0" set lastdays=%lastdays:28=29%
    if "%day%"=="0" for /f "tokens=%month%" %%i in (%lastdays%) do set day=%%i
    if %day% leq 9 set day=0%day%
    if %month% leq 9 set month=0%month%
    set package=%year%%month%%day%
    goto :EOF

    ОтветитьУдалить