Войти

Показать полную графическую версию : [решено] Батник на возврат даты


borgulio
13-05-2012, 20:54
Написал такой батник(кое что взял из предыдущих примеров) и никак не могу заставить его работать как надо:

set /a today = 1%date:~,2%
set /a tomonth = 1%date:~3,2%
set /a toyear = %date:~6,4%
set /a yearcheck = %toyear%/4*4
set $MD=31 31 28 31 30 31 30 31 31 30 31 30
if %toyear% EQU %yearcheck% set $MD=31 31 29 31 30 31 30 31 31 30 31 30
for /F "Tokens=%tomonth:~1% Delims= " %%i In ("%$MD%") Do Set /A dayz=%%i
set /a newday = %today% - 104
if %newday% LEQ 0 set /a newmonth = %tomonth:~1% - 1
if %newday% GEQ 1 set /a newmonth = %tomonth:~1%
set /a newyear = %toyear%
if %newmonth% EQU 0 set /a newyear = %toyear% - 1
if %newmonth% EQU 0 set /a newmonth = 12
if %newday% LEQ 0 set /a newday = %newday% + %dayz%
if %newday% LEQ 9 set /a newday = 10%newday%
if %newmonth% LEQ 9 set /a newmonth = 10%newmonth%

echo %newday:~1%.%newmonth:~1%.%newyear%

Должен выдавать дату на 4 дня раньше текущей
Сил нет уже тестить, то вроде хорошо работает, то по непонятным мне причинам выдает полную ерунду
Например сегодня 14.05.2012, должно выдать 10.05.2012, ничего подобного пишет 0.05.2012
если сделать так: if "%newday%" LEQ "9" set /a newday = 10%newday% выдает 101.05.2012
Почему он считает истиной '10 меньше 9' ????
Помогите разобраться что тут за магия

zion87
13-05-2012, 21:18
У мну тоже такие глюки были, приходилось другие операторы сравнивания вставлять.......

borgulio
13-05-2012, 21:48
Исправил вот так, вроде пока работает

set /a today = 1%date:~,2%
set /a tomonth = 1%date:~3,2%
set /a toyear = %date:~6,4%
set /a yearcheck = %toyear%/4*4
set $MD=31 31 28 31 30 31 30 31 31 30 31 30
if %toyear% EQU %yearcheck% set $MD=31 31 29 31 30 31 30 31 31 30 31 30
for /F "Tokens=%tomonth:~1% Delims= " %%i In ("%$MD%") Do Set /A dayz=%%i
set /a newday = %today% - 104
if %newday% LEQ 0 set /a newmonth = %tomonth:~1% - 1
if %newday% GEQ 1 set /a newmonth = %tomonth:~1%
set /a newyear = %toyear%
if %newmonth% EQU 0 set /a newyear = %toyear% - 1
if %newmonth% EQU 0 set /a newmonth = 12
if %newday% LEQ 0 set /a newday = %newday% + %dayz%
if %newday% LEQ 9 set /a newday = 10%newday%
if %newmonth% LEQ 9 set /a newmonth = 10%newmonth%

if %newday% GTR 31 (
if %newmonth% GTR 12 (
echo %newday:~1%.%newmonth:~1%.%newyear%
) ELSE echo %newday:~1%.%newmonth%.%newyear%
) ELSE if %newmonth% GTR 12 (
echo %newday%.%newmonth:~1%.%newyear%
) ELSE echo %newday%.%newmonth%.%newyear%

но это пока, уже было такое что работает, работает, а через пару дней опять косяк какой-нибудь вылазит.

firstarey
14-05-2012, 06:49
строчек конечно побольше, но и решено по другому:
@echo off
Color 0e
rem берем текущую дату:
set DD=%date:~0,2%
set DM=%date:~3,2%
set DY=%date:~6,4%
set timer=0

echo %DY%-%DM%-%DD%

if %DD%==01 set DD=%date:~1,1%
if %DD%==02 set DD=%date:~1,1%
if %DD%==03 set DD=%date:~1,1%
if %DD%==04 set DD=%date:~1,1%
if %DD%==05 set DD=%date:~1,1%
if %DD%==06 set DD=%date:~1,1%
if %DD%==07 set DD=%date:~1,1%
if %DD%==08 set DD=%date:~1,1%
if %DD%==09 set DD=%date:~1,1%

:DD_minus
rem таймер на 4 дня :)
if /i %timer%==4 goto resultat
set /a timer=%timer%+1
rem день-1
set /a DD=%DD%-1

if %DD% NEQ 0 goto DD_zero

if %DM%==01 set DM=%date:~4,1%
if %DM%==02 set DM=%date:~4,1%
if %DM%==03 set DM=%date:~4,1%
if %DM%==04 set DM=%date:~4,1%
if %DM%==05 set DM=%date:~4,1%
if %DM%==06 set DM=%date:~4,1%
if %DM%==07 set DM=%date:~4,1%
if %DM%==08 set DM=%date:~4,1%
if %DM%==09 set DM=%date:~4,1%

set /a DM=%DM%-1
if %DM%==0 (
set /a DY=%DY%-1
set DM=12
)
if %DM%==1 set DD=31
if %DM%==2 set DD=28
if %DM%==3 set DD=31
if %DM%==4 set DD=30
if %DM%==5 set DD=31
if %DM%==6 set DD=30
if %DM%==7 set DD=31
if %DM%==8 set DD=31
if %DM%==9 set DD=30
if %DM%==10 set DD=31
if %DM%==11 set DD=30
if %DM%==12 set DD=31

:DD_zero
if %DD%==9 set DD=09
if %DD%==8 set DD=08
if %DD%==7 set DD=07
if %DD%==6 set DD=06
if %DD%==5 set DD=05
if %DD%==4 set DD=04
if %DD%==3 set DD=03
if %DD%==2 set DD=02
if %DD%==1 set DD=01

if %DM%==9 set DM=09
if %DM%==8 set DM=08
if %DM%==7 set DM=07
if %DM%==6 set DM=06
if %DM%==5 set DM=05
if %DM%==4 set DM=04
if %DM%==3 set DM=03
if %DM%==2 set DM=02
if %DM%==1 set DM=01
goto DD_minus

:resultat
echo %DY%-%DM%-%DD%
pause>nul

DmitriiV
14-05-2012, 07:56
borgulio, советую использовать более подходящий для решения таких задач инструмент: средства VBScript/JScript.
На VBS, например, решение выглядит так:
WScript.Echo DateAdd("d", -4, Date)




© OSzone.net 2001-2012