PDA

Показать полную графическую версию : [решено] Как сделать,чтобы скрипт после запука,продолжил своё выполн в ЗАДАННОЕ мной время?


sashadeg
23-02-2009, 07:47
Например, я запустил скрипт, а он начал выполняться в 21:05 .... для этого есть специальня команда???

Creat0R
23-02-2009, 10:39
для этого есть специальня команда? »
_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> »
Что делает эта команда???

Creat0R
23-02-2009, 12:09
Что делает эта команда? »
Подключает библиотеку для работы с датой и временем.

sashadeg
23-02-2009, 12:12
Мда, капец, я скачал с инета русский справочник команд, ВЕСЬ выучил, НО стока нового от вас узнаю.... СПАСИБО ОГРОМНОЕ,,,,

leprecon
21-03-2009, 23:55
А как сделать так, если компьютер был выключен в заданое время, то нужно чтобы скрипт продолжил работу при запуске компьютера.

Creat0R
22-03-2009, 00:42
нужно чтобы скрипт продолжил работу при запуске компьютера »
Записать его в автозапуск?

RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce", @ScriptName, "REG_SZ", @ScriptFullPath)

leprecon
22-03-2009, 00:51
нет, а если например ждал скрипт 21:05 но не дождался :), а комп включили на следующее утро в 9 утра, и что ему опять 21:05 ждать?

Creat0R
22-03-2009, 01:46
а если например ждал скрипт 21:05 но не дождался »
Ну тогда можно в начале скрипта (при его запуске) записать в автозапуск, и если скрипт выполнил что нужно в указанное время, то просто удалить запись из реестра.

amel27
22-03-2009, 06:23
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

Creat0R
22-03-2009, 17:19
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

Но тут будет отклонение в секунду (назад и вперёд).

amel27
23-03-2009, 04:39
Тогда скрипт запустится и после и доне понял - вроде только после (само собой я имел ввиду числовой эквивалент)
тут будет отклонение в секунду (назад и вперёд) »зачем изобретать, если вся терминология присутствует в штатном планировщике?.. мы можем только определить факт наступления события и получить время, прошедшее со времени его наступления и в зависимости от этого интервала решать, произошло оно в допустимый интервал времени или нет (т.е. является просроченным)
так ещё можно »и все же пересечение границы суток не учитывается

ADD: и если секунд "00" получается $sSeconds_Less > $sSeconds_More ? :unsure:




© OSzone.net 2001-2012