Показать полную графическую версию : [решено] Как сделать,чтобы скрипт после запука,продолжил своё выполн в ЗАДАННОЕ мной время?
sashadeg
23-02-2009, 07:47
Например, я запустил скрипт, а он начал выполняться в 21:05 .... для этого есть специальня команда???
для этого есть специальня команда? »
_NowTime()?
#include <Date.au3>
_ScheduleStart_Proc("21:05:00")
Func _ScheduleStart_Proc($sStartTime)
While 1
If _NowTime() = $sStartTime Then Return 1
Sleep(100)
WEnd
EndFunc
sashadeg
23-02-2009, 11:53
#include <Date.au3> »
Что делает эта команда???
Что делает эта команда? »
Подключает библиотеку для работы с датой и временем.
sashadeg
23-02-2009, 12:12
Мда, капец, я скачал с инета русский справочник команд, ВЕСЬ выучил, НО стока нового от вас узнаю.... СПАСИБО ОГРОМНОЕ,,,,
leprecon
21-03-2009, 23:55
А как сделать так, если компьютер был выключен в заданое время, то нужно чтобы скрипт продолжил работу при запуске компьютера.
нужно чтобы скрипт продолжил работу при запуске компьютера »
Записать его в автозапуск?
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce", @ScriptName, "REG_SZ", @ScriptFullPath)
leprecon
22-03-2009, 00:51
нет, а если например ждал скрипт 21:05 но не дождался :), а комп включили на следующее утро в 9 утра, и что ему опять 21:05 ждать?
а если например ждал скрипт 21:05 но не дождался »
Ну тогда можно в начале скрипта (при его запуске) записать в автозапуск, и если скрипт выполнил что нужно в указанное время, то просто удалить запись из реестра.
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce", @ScriptName, "REG_SZ", @ScriptFullPath) »а почему "RunOnce"?.. он же одноразовый - его придется создавать при каждом запуске
думаю скрипт будет проще, если использовать ключ "Run"
If _NowTime() = $sStartTime Then Return 1 »Windows не является ОСью реального времени, поэтому логичней ставить ">=" вместо равенства... Тем более, если речь о возможной перезагрузке... Хотя на самом деле все сложней чем кажется. Предпложим, что комп выключили в "21:00:00" и включили на следующий день в 8:00 - время просрочено, а скрипт этого не сможет определить, выходов два: 1) задавать всегда точную дату/время; 2) сохранять где-нибудь время последнего запуска скрипта. Последний вариант уже напоминает полноценный шедулер с периодическим запуском (раз в год, раз в месяц, etc) и логикой анализа просроченных заданий. Первый вариант "одноразовый" и поэтому проще:
#include <Date.au3>
$sRegKey = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
$sRegVal = RegRead($sRegKey, @ScriptName)
If Not($sRegVal = @ScriptFullPath) Then RegWrite($sRegKey, @ScriptName, "REG_SZ", '"'& @ScriptFullPath &'"')
_ScheduleStart_Proc("2009","03","22","21","05","00")
RegDelete($sRegKey, @ScriptName)
Func _ScheduleStart_Proc($iYear, $iMonth, $iDay, $iHour, $iMinute, $iSecond)
Local $tFileNow, $tFile=_Date_Time_EncodeFileTime($iMonth, $iDay, $iYear, $iHour, $iMinute, $iSecond)
Local $pFileNow, $pFile=DllStructGetPtr($tFile)
Do
Sleep(100)
$tFileNow = _Date_Time_EncodeFileTime(@MON, @MDAY, @YEAR, @HOUR, @MIN, @SEC)
$pFileNow = DllStructGetPtr($tFileNow)
Until _Date_Time_CompareFileTime($pFileNow, $pFile)>=0
EndFunc
leprecon,
Сорри, я не так понял... можно при запуске с реестра добавить ком. строку, чтрбы скрипт её распознавал, и сразу выполнял нужные действия.
а почему "RunOnce"? »
Мне казалось что один раз нужно запустить скрипт (пока не выполнится событие).
логичней ставить ">=" вместо равенства »
Тогда скрипт запустится и после и до :)...
Меня вариант с точной проверкой ещё не подводил, простенький будильник на этой основе работает и будит меня :) - Но я согласен, этот вариант не самый лучший. Я свой пример привёл в качестве шаблона, не более.
Кстати, чтобы сильно не усложнять, вот так ещё можно:
#include <Date.au3>
_ScheduleStart_Proc("16:20:55")
Func _ScheduleStart_Proc($sStartTime)
While 1
$sNowTime = _NowTime()
$sSeconds_Less = StringRight($sStartTime, 2) - 1
$sSeconds_More = $sSeconds_Less + 2
If $sSeconds_Less < 0 Then $sSeconds_Less += 59
If $sSeconds_More = 60 Then $sSeconds_More = "00"
If StringLen($sSeconds_Less) = 1 Then $sSeconds_Less = "0" & $sSeconds_Less
If StringLen($sSeconds_More) = 1 Then $sSeconds_More = "0" & $sSeconds_More
$sStartTime_Less = StringTrimRight($sStartTime, 2) & $sSeconds_Less
$sStartTime_More = StringTrimRight($sStartTime, 2) & $sSeconds_More
If ($sNowTime = $sStartTime) Or ($sNowTime >= $sStartTime_Less And $sNowTime <= $sStartTime_More) Then Return 1
Sleep(100)
WEnd
EndFunc
Но тут будет отклонение в секунду (назад и вперёд).
Тогда скрипт запустится и после и доне понял - вроде только после (само собой я имел ввиду числовой эквивалент)
тут будет отклонение в секунду (назад и вперёд) »зачем изобретать, если вся терминология присутствует в штатном планировщике?.. мы можем только определить факт наступления события и получить время, прошедшее со времени его наступления и в зависимости от этого интервала решать, произошло оно в допустимый интервал времени или нет (т.е. является просроченным)
так ещё можно »и все же пересечение границы суток не учитывается
ADD: и если секунд "00" получается $sSeconds_Less > $sSeconds_More ? :unsure:
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.