Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Прибавить время (http://forum.oszone.net/showthread.php?t=222017)

Lexa72 02-12-2011 17:40 1808104

Прибавить время
 
Помогите пожалуста с решением проблемы, я уже мозг сломал, пока пытался скрипт написать. В общем, у меня есть файл со строчками, каждая из них начинается со времени, а дальше разная информация идет. Как получать время из строчки - я понял. Мне нужно прибавить ко времени в строчке 15 секунд, и не получается, хоть ты тресни. Если секунд меньше 39 - все нормально, а если больше - это получается надо прибавлять минуты, а если и минуты за 59 переваливают, то и часы. Начал писать условие if, но бросил, не осилил. Может кто поможет? Вот образец строчки, если что
13:01:26 Could not establish connection to Steam servers (steamclient2).

Anonymоus 02-12-2011 18:05 1808115

Например вот это, примеры использования показаны, так что думаю, разберётесь. Время разбирается на HH MM SS через For, для использования в дальнейшем, вот так:
Код:

For /F "tokens=1,2,3 delims=:" %%A In ("13:01:26") Do (
Set HH=%%A
Set MM=%%B
Set SS=%%C
)

А это сами функции для работы со временем
Код:

@Echo Off

:: Устанавливаем время
Set HH=23
Set MM=15
Set SS=00

:: Демонстрация работы
:: ===================================
Echo Time                  = [%HH%:%MM%:%SS%]
Call :SerializeTime
Set TmpTime=%ErrorLevel%
Echo Serialized time      =  %TmpTime%
Call :DeserializeTime %TmpTime%
Echo Deserialized time    = [%DHH%:%DMM%:%DSS%]
Call :TMinus %TmpTime% 9014
Call :DeserializeTime %ErrorLevel%
Echo Time - 2:30:14        = [%DHH%:%DMM%:%DSS%]
Call :TPlus %TmpTime% 9014
Call :DeserializeTime %ErrorLevel%
Echo Time + 2:30:14        = [%DHH%:%DMM%:%DSS%]
Pause&Exit
:: ===================================

::===Функции работы со временем в .bat====================================
:: Anonymous, 2010
:: v 1.3
:ParseTimestamp
:: Разбирает на составляющие временную метку формата ЧЧ:ММ:СС
:: Формат:  Call :ParseTimestamp (время)
:: К примеру - Call :ParseTimestamp %time:~-0,8%
:: Вывод - в переменные HH MM и SS
For /F "tokens=1,2,3 delims=:" %%A In ("%1") Do (
    Set HH=%%A
    Set MM=%%B
    Set SS=%%C
)

:SerializeTime
:: Сериализует время из переменных HH MM и SS
:: Вывод - в ErrorLevel
Call :Cut %HH% HH&Call :Cut %MM% MM&Call :Cut %SS% SS
Set /A STime=(HH*60*60)+(MM*60)+SS
Exit /B %STime%

:DeserializeTime
:: Десериализует время, приводит его к стандартному формату
:: Формат:  Call :DeserializeTime (сериализованное время)
:: Вывод - в переменные DHH DMM и DSS
Set DHH=00&Set DMM=00&Set DSS=00
Set /A DHH=%1/60/60
Set /A DMM=(%1/60)-(DHH*60)
Set /A DSS=%1-(DHH*60*60)-(DMM*60)
If %DHH%==24 Set DHH=00
If %DHH% LSS 10 Set DHH=0%DHH%
If %DMM% LSS 10 Set DMM=0%DMM%
If %DSS% LSS 10 Set DSS=0%DSS%
Exit /B

:TMinus
:: Функция вычитания для сериализованного времени
:: Формат:  Call :TMinus (сериализованное время) (сколько секунд отнять)
:: Вывод - в ErrorLevel
Set Result=
Set /A Result=%1-%2
If %2 GTR %1 (
    Set /A Result=86400+%1-%2
)
Exit /B %Result%

:TPlus
:: Функция прибавления для сериализованного времени
:: Формат:  Call :TPlus (сериализованное время) (сколько секунд прибавить)
:: Вывод - в ErrorLevel
Set Result=
Set /A Result=%1+%2
If %Result% GTR 86400 (
    Set /A Result=%1+%2-86400
)
Exit /B %Result%

:Timer
:: Отсчитывает прошедшее с заданного момента время
:: Формат:  Call :Timer (запомненное сериализованное время)
:: Вывод - в ErrorLevel
:: Если счетчик переходит границу суток, число дней возрастает на 1
:: Дни выводятся в переменную ED (и накапливаются) // да, знаю, что костыль и быдлокод
Set OTime=%1
If "%ED%"=="" Set ED=0
Call :ParseTimestamp %time:~-0,8%
Call :SerializeTime
Set CTime=%STime%
If %OTime% GTR %CTime% (
    Set /A Timer=86400-%OTime%+%CTime%
    Set /A ED+=1
) Else (
    Set /A Timer=CTime-OTime
)
Exit /B %Timer%

:Timer2
:: Проверяет, прошел ли заданный промежуток времени
:: Формат:  Call :Timer2 (запомненное сериализованное время) (промежуток в секундах)
:: Вывод - в ErrorLevel (только 0=промежуток истёк или 1=промежуток ещё не истёк)
Call :ParseTimestamp %time:~-0,8%
Call :SerializeTime
Call :TMinus %STime% %1
If %2 GTR %Result% Set Timer2=1&Exit /B 1
Set Timer2=0&Exit /B 0

:Cut
:: Убирание ведущих нулей и пробелов
:: Формат:  Call :Cut (Двухзначное число) (Переменная, куда вывести резуьтат)
Set d=%1
If "%d:~,1%"=="0" Set %2=%d:~1%
If "%d:~,1%"==" " Set %2=%d:~1%
Exit /B
::========================================================================

А если не секрет, в чем сакральный смысл прибавления 15 секунд к времени из логов (судя по "Steam" - игры)?

Lexa72 02-12-2011 19:49 1808180

Спасибо большое!

Iska 03-12-2011 03:57 1808401

Цитата:

Цитата Anonymоus
А если не секрет, в чем сакральный смысл прибавления 15 секунд к времени из логов (судя по "Steam" - игры)? »

Тсс! Мальчиш-Кибальчиш такие тайны не выдаёт :).

ARMAGIDON 01-09-2020 13:48 2932636

Цитата:

Цитата Anonymоus
так что думаю, разберётесь. »

Привет, а можно в этот код добавить текущее время и вывод остатка в секундах ?
например сейчас
10:30
мы установили время
9:30
батник прибавил три часа это
12:30
вот нужно узнать время в секундах между текущем, а именно 10:30 и будущем 12:30

Я что то пробовал вывести, но больше запутался
:flag:

Elven 01-09-2020 16:04 2932647

Цель-то какая? А то:
1. Тема 2011 года (некропостерство в решенных темах это такое себе)
2. Если известно время которое было добавлено не проще ли сразу вломить timeout на это же количество секунд?
например
Код:

timeout 15
3. Решать проблемы со временем на cmd когда есть куда как более удобный powershell опять же так себе вариант.
4. Даже если уперлись в cmd, то есть способы получения текущего времени гораздо более надежные чем потрошение %date% (несколько раз меня это дело здорово подводило из-за разных региональных настроек, посему пользую другой вариант)
вот этот
Код:

@echo off
for /f "tokens=1* delims==" %%a in ('"wmic path win32_localtime get Day,Month,Year,Hour,Minute,Second /value|find "^=""') do set "%%a=0%%b"
set Year=%Year:~-5%
set Month=%Month:~-3%
set Day=%Day:~-3%
set Hour=%Hour:~-3%
set Minute=%Minute:~-3%
set Second=%Second:~-3%
echo %Year%.%Month%.%Day% - %Hour%:%Minute%:%Second%


ARMAGIDON 01-09-2020 19:39 2932668

Цитата:

Цитата Elven
Цель-то какая? »

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


Время: 00:59.

Время: 00:59.
© OSzone.net 2001-