PDA

Показать полную графическую версию : Как сравнить %DATE% с установленной в ручную датой??


angelada89
10-02-2010, 14:06
Пишу небольшую программку! столкнулся с проблемой никак не пойму как сравнить %DATE% с датой которая мне нужна!
вот пример:
@echo off
copy 111.bat C:\Windows\system
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v 111 /t REG_SZ /d C:\Windows\system\111.bat /f>nul
CHCP 1251
IF %DATE%==10.02.2010 GOTO abc
EXIT
:abc

Тут дальнейшие выполняемые действия программки

EXIT

Так он сравнивает только с 10.02.2010 а мне надо чтобы он проверял начиная с 10 числа. Как бы параметр => (больше либо равно)
Потому что если 10.02.2010 компьютер не был включен то и батник этот не заработает.

Помогите пожалуста, перерыл все что мог... нигде не могу найти ответа, а типичной функйии => как я понял нет.

gora
10-02-2010, 14:11
[решено] Как сделать,что б батник проверял число ? (http://forum.oszone.net/post-1330394.html#post1330394)

а типичной функйии => как я понял нет. »
Есть, но форма записи иная. Смотрите If /?

angelada89
10-02-2010, 14:27
это вот такой будет конечный результат?


@echo off
copy 111.bat C:\Windows\system
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v 111 /t REG_SZ /d C:\Windows\system\111.bat /f>nul
CHCP 1251
IF %date:~6,4%%date:~3,2%%date:~0,2% GTR 20100328 GOTO abc
EXIT
:abc

Тут дальнейшие выполняемые действия программки

EXIT

Если это правльно! то возникает сразу следующий вопрос! А можно ли сделать так что когда ты ставишь прогу она к текущей дате прибавила определенное кол-во дней и потом уже проверяла именно от даты которая получится!
Это как бы надо прибавить к дате текущей дни, месяца и года , потом записать это в переменную и сравнивать уже с переменной.... такое вообще возможно?? Буду очень признателен если получится

вот так было бы удобне просто с функцией => (линк почему то не работает!) можете ссылку перезалить

if /? не к чему не привел=) я уже это не раз читал=) все никак не пойму как поставить чтобы параметр был больше либо равно!

Если знаете помогите пожалуста просто горит уже надо очень сильно написать......

gora
10-02-2010, 14:40
if /? не к чему не привел я уже это не раз читал все никак не пойму как поставить чтобы параметр был больше либо равно! »
Изменение команды IF при включении расширенной обработки команд:

IF [/I] строка1 оператор_сравнения строка2 команда

где оператор_сравнения принимает следующие значения:

EQU - равно (в оригинале справки написано EQL, но это ошибка переводчиков справки)
NEQ - не равно
LSS - меньше
LEQ - меньше или равно
GTR - больше
GEQ - больше или равно

сделать так что когда ты ставишь прогу она к текущей дате прибавила определенное кол-во дней и потом уже проверяла именно от даты которая получится! »
Непонятна задача. Какая прога? Какую дату она должна менять? В системе? В батнике? Запускается она из этого же батника? Распишите все подробно и с "числовыми" примерами.

angelada89
10-02-2010, 14:55
@echo off
copy vrem.bat C:\Windows\system
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v vrem /t REG_SZ /d C:\Windows\system\vrem.bat /f>nul
CHCP 1251
IF /i '%DATE%' GEQ '12.02.2010' goto abc
goto end
:abc
msg * "бла бла бла бла ..."
:end
EXIT


так?? почучается если дата больше чем 12.02.2010 он выдаст сообщение!

теперь то что было не понятно! вот я запустил батник на компе! надо чтобы он определил дату, к этой дате прибавил кол-во дней заданных мною например 5 дней. и в дальнейшем сравнивал уже с новой датой тоесть не с 12.02.2010 а с просчитанной датой которая на 5 дней больше чем дата в момент запуска батника

gora
10-02-2010, 15:13
так?? почучается если дата больше чем 12.02.2010 он выдаст сообщение! »
Нет, не так. Так он у Вас будет корректно работать до конца февраля, а первого марта работать корректно перестанет. Правильно так:IF %date:~6,4%%date:~3,2%%date:~0,2% GEQ 20100212 GOTO abc к этой дате прибавил кол-во дней заданных мною например 5 дней. и в дальнейшем сравнивал уже с новой датой тоесть не с 12.02.2010 а с просчитанной датой которая на 5 дней больше чем дата в момент запуска батника »
Т.е., если я запустил его сегодня, то сравнивать надо с 17.02.2010, а если запустил завтра, то с тем же числом 17.02.2010 или с 18.02.2010? Если первое, то где батник должен хранить эту дату, во внешнем файле? И где будет прописано это число (5 дней), в самом батнике или будет ему передаваться в переменной?

angelada89
10-02-2010, 15:31
IF %date:~6,4%%date:~3,2%%date:~0,2% GEQ 20100212 GOTO abc на счет этого понял! уже сам допер и исправил!=)
а вот на счет 5 дней вы не так поняли=)
я запустил батник сегодня надо с сегоднящней даты прибавить опрелделенное кол-во дней.
принцип триальных программ! сегодня запустил сегодня отсчет и пошел! как прошло 30 дней так прога перестала работать! а тут как прошло допустим 5 дней то прога выдала сообщение..


я так понимаю надо будет писать IF %date:~6,4%%date:~3,2%%date:~0,2% GEQ 20100212 GOTO abc
только место 20100212 нужна будет переменная! а эту переменную батник сам посчитает при запуске ! смысл такой что я запустил батник выЯвил сегодняшнее число, прибавил к нему 5-10 -20 дней на свое усмотрение и далее уже IF %date:~6,4%%date:~3,2%%date:~0,2% GEQ Peremennaya GOTO abc
все это будет в 1 батнике.

1. Запуск батника
2. выявление сегодняшнего числа
3. прибавка к нему кол-ва дней и сохранение новой даты как переменная
4. сравнение текущей даты с переменной
5. ну а далее там понятно уже деййствия по условию

angelada89
10-02-2010, 18:38
такс вот код который прибавляет дни начиная с запуска!

@echo off
set T_Date=%DATE%
IF %T_DATE:~0,1%==0 (
SET /A T_DAY=%T_DATE:~1,1%) else (
SET /A T_DAY=%T_DATE:~0,2%)

IF %T_DATE:~3,1%==0 (
SET /A T_MONTH=%T_DATE:~4,1%) else (
SET /A T_MONTH=%T_DATE:~3,2%)
SET /A T_YEAR=%T_DATE:~6,4%

SET /A T_DAY=%T_DAY%+31

IF %T_DAY% GTR 31 SET /A T_MONTH=%T_MONTH%+1
IF %T_MONTH% GTR 12 SET /A T_YEAR=%T_YEAR%+1
if %T_MONTH%==1 Set /A DIM=31
if %T_MONTH%==2 Set /A DIM=28
if %T_MONTH%==3 Set /A DIM=31
if %T_MONTH%==4 Set /A DIM=30
if %T_MONTH%==5 Set /A DIM=31
if %T_MONTH%==6 Set /A DIM=30
if %T_MONTH%==7 Set /A DIM=31
if %T_MONTH%==8 Set /A DIM=31
if %T_MONTH%==9 Set /A DIM=30
if %T_MONTH%==10 Set /A DIM=31
if %T_MONTH%==11 Set /A DIM=30
if %T_MONTH%==12 Set /A DIM=31
IF %T_DAY% GTR 31 SET /A T_DAY=%T_DAY%-%DIM%
IF %T_MONTH% GTR 12 SET /A T_MONTH=1

echo %T_DAY%.%T_MONTH%.%T_YEAR%

pause

Есть 2 проблемы в нем :
1) это когда месяц январь то после того как он прибавит 30 дней то выдает дни типа 32, 33, 34 ,35 и так далее! это только с январем с другими месецами вроде нормально.
2) вторая проблемка что когда он прибавляет дни он считает не правильно! типа было 10 февраля он прибавил 30 дней и стало не 12 как должно быть, а 8.

amel27
11-02-2010, 05:52
исправленный вариант моего старого (http://forum.oszone.net/post-500342-18.html) скрипта, тестируйте:

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

SET SIGN=+
SET DAYS=31

If %DATE:~0,1%==0 (Set T_DAY=%DATE:~1,1%) Else Set T_DAY=%DATE:~0,2%
If %DATE:~3,1%==0 (Set T_MONTH=%DATE:~4,1%) Else Set T_MONTH=%DATE:~3,2%
Set T_YEAR=%DATE:~6,4%

:SkipDays
Call :NextDay %SIGN%1
Set /A DAYS=%DAYS%-1
If %DAYS% NEQ 0 GoTo :SkipDays

Set T_DAY=0%T_DAY%& Set T_MONTH=0%T_MONTH%
Echo %T_DAY:~-2%.%T_MONTH:~-2%.%T_YEAR%
Exit /B 0

:NextDay
Call :GetDaysOfMonth
Set /A T_DAY=%T_DAY%%~1
If %T_DAY% GTR !T_DOFM! (
Call :NextMonth +1
Call :GetDaysOfMonth
Set T_DAY=1
)
If %T_DAY% EQU 0 (
Call :NextMonth -1
Call :GetDaysOfMonth
Set T_DAY=!T_DOFM!
)
GoTo :EOF

:NextMonth
Set /A MNDF=%T_YEAR%*12+%T_MONTH%%1
Set /A T_YEAR=(%MNDF%-1)/12
Set /A T_MONTH=%MNDF%-%T_YEAR%*12
GoTo :EOF

:GetDaysOfMonth
Set /A M1=T_YEAR-(T_YEAR/4)*4
Set /A M2=T_YEAR-(T_YEAR/100)*100
Set /A M3=T_YEAR-(T_YEAR/400)*400

Set $MD=31 28 31 30 31 30 31 31 30 31 30 31
If 0 EQU %M1% IF 0 NEQ %M2% Set $MD=31 29 31 30 31 30 31 31 30 31 30 31
If 0 EQU %M3% Set $MD=31 29 31 30 31 30 31 31 30 31 30 31

For /F "Tokens=%T_MONTH% Delims= " %%i In ("%$MD%") Do Set /A T_DOFM=%%i
GoTo :EOF

angelada89
11-02-2010, 13:32
Amel27 отличный код спасибо все рботает!
Теперь мне надо сравнить дату сегодняшнюю с тем что высчитало...
Если ставить так то не работает!
IF %date:~6,4%%date:~3,2%%date:~0,2% LSS %T_DAY:~-2%%T_MONTH:~-2%%T_YEAR% GOTO abc
пробовал по анологии
IF %date:~6,4%%date:~3,2%%date:~0,2% GEQ 20100212 GOTO abc

тоесть втсавил так сначала год, месяц а потом и день! все без точек
%date:~6,4%%date:~3,2%%date:~0,2% LSS %T_YEAR%%T_MONTH:~-2%%T_DAY:~-2% GOTO abc
тоже не работает!

И если получится то останется последняя проблема! Чтобы батник сам проверял каждый день сколько осталось дней до того числа которое он высчитывает... Ведь если он будет в автозапуске то он каждый раз при загрузке будет высчитывать новое число! верно же??....
Получается надо сделать так чтобы он как бы 1 раз высчитал число на 31 день больше, и потом уже при запуске только сверялся с ним а не перерасчитывал все это

gora
11-02-2010, 15:03
angelada89, ваша задача решается проще:@Echo Off
:: Первый запуск скрипта и запоминание даты в файл fstStrt.lst
:: Скрипт после этого НЕ перемещать, иначе не найдет файл fstStrt.lst !!!
If Not Exist fstStrt.lst Echo %date%>fstStrt.lst& Exit

:: Второй и последующие запуски скрипта
For /F %%I In (fstStrt.lst) Do Set fstStrt=%%I

:: Для тестов можно раскомментировать строку и вписать в нее дату первого запуска
:: Set fstStrt=25.01.2010

:: Период, в течении которого будет работать, вписать в строку ниже
Set prd=30

Call :JDat %date%
Set less=%JDate%
Call :JDat %fstStrt%
Set /a less=JDate+prd-less
If %less% GTR 0 (
Echo Осталось дней: %less%
Ping -n 5 localhost>Nul
) Else (
Echo %prd% дней закончились
pause>nul
)
Exit

:JDat
Set dat=%1
Set /a m=(1%dat:~3,2%-114)/12
Set /a JDate=1%dat:~0,2%+((1%dat:~3,2%-102-m*12)*367+((%dat:~6%+m)*487-49-(%dat:~6%+m)/100)*9)/12
GoTo:EOF

amel27
11-02-2010, 15:47
тоесть втсавил так сначала год, месяц а потом и день »
перед сравнением нужно выровнять формат, где-то так:

Set T_DAY=0%T_DAY%& Set T_MONTH=0%T_MONTH%
Set T_DAY=%T_DAY:~-2%& Set T_MONTH=%T_MONTH:~-2%

If %DATE:~6,4%%DATE:~3,2%%DATE:~0,2% LSS %T_YEAR%%T_MONTH%%T_DAY% GoTo ABC


1 раз высчитал число на 31 день больше, и потом уже при запуске только сверялся с ним »
тогда нужно решить где хранить эту вычисленную дату - в реестре или файле (как предложил gora)

angelada89
11-02-2010, 20:33
такс вариант GORA вроде подошел

сюда
If %less% GTR 0
( Echo Осталось дней: %less% Ping -n 5 localhost>Nul )
Else
( ВСТАВИЛ СВОИ ДЕЙСТВИЯ

Set prd=40 поставил 40 дней! считать все норма же будет?? даже если я 60-70 поставлю??




© OSzone.net 2001-2012