Что нового

Запуск компьютера по таймеру средствами AutoIT

JohnWind

Новичок
Сообщения
58
Репутация
0
Доброго времени суток,

имеется 2 скрипта, которые запускаются (посредством Windows Task Scheduler) в различное время.
дело в том, что 1й скрипт (в зависимости от кол-ва обрабатываемой информации) может закончить работу например за 1 час, а в других условиях за 4 часа.
время между запусками скриптов - 2ч.

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

вопрос: можно ли средствами AutoIT создать ситуацию, в которой при окончании работы 1го скрипта засекалось время его окончания + добавлялось стандартное время "через сколько запустить 2й скрипт" + компьютер отправлялся бы в гибернацию на время паузы (2ч) + а затем реализовывался (каким либо методом) бы запуск 2го скрипта согласно вычислениям выше (через 2 часа после окончания работы 1го скрипта)?

заранее спасибо.
 

Oki

Продвинутый
Сообщения
452
Репутация
63
Если компьютер находится в гибернации, то какой процессор будет выполнять проверку того, достаточно ли истекло времени?
 

All2khoff

Продвинутый
Сообщения
371
Репутация
66
условно имеем скрипы с именами
скрипт1 и скрипт2
в скриптах проверку на запущенный дубль скрипта и всё.
Код:
If    ProcessExists ( "Скрипт 1" ) Then Exit
If    ProcessExists ( "Скрипт 2" ) Then Exit

скрипты так же можно вложить друг в друга, и уже там сделать задержку выполнения между задачами.
Код:
sleep (2*3600*1000) ; пауза 2 часа
 

RaZum

Знающий
Сообщения
78
Репутация
14
Запуск скрипта 1
Ожидание завершения его работы
Фиксирование времени завершения
Установка/корректировка и активация триггера 2 (в Task Scheduler) выхода из гибернации (завершение + 2 часа)
Запуск проверки истечения заданного времени
Перевод в состояние гибернации
Выход из гибернации (система)
... продолжение проверки истечения времени
Запуск скрипта 2
Ожидание завершения его работы
...

Видимо такой цикл имеется ввиду ?
 
Автор
J

JohnWind

Новичок
Сообщения
58
Репутация
0
1.Запуск скрипта 1
2. Ожидание завершения его работы
3. Фиксирование времени завершения
4. Установка/корректировка и активация триггера 2 (в Task Scheduler) выхода из гибернации (завершение + 2 часа)
5. Запуск проверки истечения заданного времени
6. Перевод в состояние гибернации
7. Выход из гибернации (система)
8... продолжение проверки истечения времени
9. Запуск скрипта 2
10. Ожидание завершения его работы
...

Видимо такой цикл имеется ввиду ?
я добавил номера в вашу схему:
ключевой момент 3 и 4
5 = 6 - как только 1й скрипт закончил работу - сразу уход в гибернацию
7 = 8 - выходи из гибернации = сразу запуск 2го
10 - не критично уже, т.к. в конце 2го скрипта есть уход в гибернацию
Сообщение автоматически объединено:

условно имеем скрипы с именами
скрипт1 и скрипт2
в скриптах проверку на запущенный дубль скрипта и всё.
Код:
If    ProcessExists ( "Скрипт 1" ) Then Exit
If    ProcessExists ( "Скрипт 2" ) Then Exit

скрипты так же можно вложить друг в друга, и уже там сделать задержку выполнения между задачами.
Код:
sleep (2*3600*1000) ; пауза 2 часа
дело в том, что хочется избежать простоя компа в течении 2-2,5 часов между окончанием 1го скрипта и запуском 2го.. .от того и вопрос темы...
Сообщение автоматически объединено:

Если компьютер находится в гибернации, то какой процессор будет выполнять проверку того, достаточно ли истекло времени?
вот тут и вопрос - можно ли как-либо (без жёсткого геморроя) изменить таск в Планировщике задач скорректировав Триггер запуска согласно формуле:

время когда 1й скрипт закончится + 2-2,5 часа
Сообщение автоматически объединено:

всем желающим помочь - давайте попробуем задать задачу так:

если реально решить проблему без жуткого геморроя - давайте попробуем.. если же нет - нет смысла тратить силы... можно будет продолжать руками переставлять каждый раз
 

RaZum

Знающий
Сообщения
78
Репутация
14
Код:
$Pid = RunWait ("script_1.exe") ; запуск скрипта с ожиданием его завершения
; если неуходит в ожидание, то можно добавить
ProcessWaitClose ($Pid) ; ожидание удаления процесса
; далее макросами получение времени
$Hour = @HOUR
$Min = @MIN
; в Task Scheduler заранее подготовить задания 
; и корректировать время и активацию через schtasks.exe примерно так
Run (@SystemDir & '\schtasks.exe /change /TN "Schedule_1" /ST ' & ($Hour + 2) & ':' & $Min )
; далее уход в состояние гибернации
Shutdown (64)
; далее запуск второго скрипта т.к. 2 часа прошло

Это общий вид без подробностей, но надеюсь основные моменты раскрыл
Запуск второго скрипта (да и вообще обоих) можно выполнять и с помощью Task Scheduler, но тогда и отслеживать его придется немного по другому.
По schtasks.exe /? - тут подробно описаны все команды

надеюсь информация окажется полезной
 
Автор
J

JohnWind

Новичок
Сообщения
58
Репутация
0
Код:
$Pid = RunWait ("script_1.exe") ; запуск скрипта с ожиданием его завершения
; если неуходит в ожидание, то можно добавить
ProcessWaitClose ($Pid) ; ожидание удаления процесса
; далее макросами получение времени
$Hour = @HOUR
$Min = @MIN
; в Task Scheduler заранее подготовить задания
; и корректировать время и активацию через schtasks.exe примерно так
Run (@SystemDir & '\schtasks.exe /change /TN "Schedule_1" /ST ' & ($Hour + 2) & ':' & $Min )
; далее уход в состояние гибернации
Shutdown (64)
; далее запуск второго скрипта т.к. 2 часа прошло

Это общий вид без подробностей, но надеюсь основные моменты раскрыл
Запуск второго скрипта (да и вообще обоих) можно выполнять и с помощью Task Scheduler, но тогда и отслеживать его придется немного по другому.
По schtasks.exe /? - тут подробно описаны все команды

надеюсь информация окажется полезной
отличный план!
спасибо за инфу!
Сообщение автоматически объединено:

Код:
$Pid = RunWait ("script_1.exe") ; запуск скрипта с ожиданием его завершения
; если неуходит в ожидание, то можно добавить
ProcessWaitClose ($Pid) ; ожидание удаления процесса
; далее макросами получение времени
$Hour = @HOUR
$Min = @MIN
; в Task Scheduler заранее подготовить задания
; и корректировать время и активацию через schtasks.exe примерно так
Run (@SystemDir & '\schtasks.exe /change /TN "Schedule_1" /ST ' & ($Hour + 2) & ':' & $Min )
; далее уход в состояние гибернации
Shutdown (64)
; далее запуск второго скрипта т.к. 2 часа прошло

Это общий вид без подробностей, но надеюсь основные моменты раскрыл
Запуск второго скрипта (да и вообще обоих) можно выполнять и с помощью Task Scheduler, но тогда и отслеживать его придется немного по другому.
По schtasks.exe /? - тут подробно описаны все команды

надеюсь информация окажется полезной
не весёлая новость - при попытке изменить время по примеру выше - ничего не происходит, таск остаётся без изменений.
попробовал выполнить строку Run - в cmd - с хард-код временем, при отправке - появляется запрос на пароль текущего юзера... т.е. надо или ввести его (если установлен) или нажать Enter - чтоб произошла замена... в таких условиях таск обновляется...

осталось придумать как обновить его из среды AutoIT
Сообщение автоматически объединено:

странная фигня... есть просто выполнить Run из примера выше... то попытка отправить Send ({ENTER}) не даёт результата.
более того, даже клик в поле исполняемого cmd не помогает с последующим Send ({ENTER})

пришлось добавить два Alt+Tab (выйти и вернутся в приложение)... только после этого Send ({ENTER}) отрабатывается корректно и таск апдейтится.
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,948
Репутация
1,443
Для работы с планировщиком нужны права администратора.
В скрипт нужно добавить
Код:
#RequireAdmin

А в свойствах задачи планировщика на вкладке "Общие" включить "Выполнять с наивысшими правами".
 

RaZum

Знающий
Сообщения
78
Репутация
14
самое простое решение
Код:
Sleep (3000) ; Время на появление окна
;Send ("password") ; Если есть пароль
Send ("{ENTER}") ; Подтверждение
 
Автор
J

JohnWind

Новичок
Сообщения
58
Репутация
0
Для работы с планировщиком нужны права администратора.
В скрипт нужно добавить
Код:
#RequireAdmin

А в свойствах задачи планировщика на вкладке "Общие" включить "Выполнять с наивысшими правами".
добавил в код... в таске права установлены... при комментировании двойного Alt+Tab - изменений не происходит

самое простое решение
Код:
Sleep (3000) ; Время на появление окна
;Send ("password") ; Если есть пароль
Send ("{ENTER}") ; Подтверждение
проблема не в появлении... в том, что даже при наличии фокуса на объекте cmd (через WinActivate, прямым MouseClick в окне) - отправка Send Enter - не происходит...

но вместе с тем, достаточно вывести фокус из объекта (1й раз Alt+Tab) и вернуть назад (2й раз) - то Send Enter - считывается без проблем.
 
Автор
J

JohnWind

Новичок
Сообщения
58
Репутация
0
проблема разрешилась самым что ни на есть прямым методом: непосредственно перед Enter - я активирую окно через WinActivate

в итоге финальный код получился таким:

Код:
; в Task Scheduler заранее подготовить задания
; и корректировать время и активацию через schtasks.exe примерно так
Run (@SystemDir & '\schtasks.exe /change /TN "2nd Task_name" /ST ' & '0'&($Hour + 2) & ':' & $Min )
Sleep (1000)
WinActivate("C:\WINDOWS\SysWOW64\schtasks.exe", "")
Send("{ENTER}")

; далее уход в состояние гибернации
; далее запуск второго скрипта т.к. 2 часа прошло


примечание: т.к. таск ночной, и часы до 10, пришлось добавить 0 перед прибавлением к часам +2; в противном случае прибавление к 01 + 2 = превращает результат в 3, что нарушает формат ЧЧ:ММ

уверен что есть куда более изящное решение, с проверкой часов (если менее 10 добавить 0 в начале, если 10 и более - не делать этого)... если у кого есть мысли - велкам!

Ну а пока - и так сойдёт...
всем большое спасибо за помощь!
 

RaZum

Знающий
Сообщения
78
Репутация
14
Код:
Run (@SystemDir & '\schtasks.exe /change /TN "2nd Task_name" /ST ' & StringFormat ("%02d:%02d", $Hour + 2, $Min) )

Сообщение автоматически объединено:

Если переходит через смену суток, то надо заранее поставить условие.
Например так:
Код:
$Hour = @HOUR + 2
If $Hour > 23 Then $Hour -= 24
Run (@SystemDir & '\schtasks.exe /change /TN "2nd Task_name" /ST ' & StringFormat ("%02d:%02d", $Hour, $Min))

Сообщение автоматически объединено:

По поводу окна.
Как вариант:
Код:
$Title = "[REGEXPTITLE:schtasks.exe; CLASS:ConsoleWindowClass]"
$hWnd = WinWait ($Title)                ; Ожидание появления окна
;If $Pid = WinGetProcess ($hWnd) Then    ; Если нужно сопоставление с процессом
                                        ; (или можно перебирать в цикле WinList ($Title) )
    WinActivate ($hWnd)                    ; Активация - передача фокуса - если не активно
;    SendKeepActive ($hWnd)                ;  (или удержание окна активным - если происходит потеря фокуса)
;    Send ("password")                    ; Если пароль присутствует
    Send ("{ENTER}")                    ; Подтверждение
;    SendKeepActive ("")                    ;  (отмена удержания)
;EndIf
 
Последнее редактирование:
Автор
J

JohnWind

Новичок
Сообщения
58
Репутация
0
Код:
Run (@SystemDir & '\schtasks.exe /change /TN "2nd Task_name" /ST ' & StringFormat ("%02d:%02d", $Hour + 2, $Min) )

Сообщение автоматически объединено:

Если переходит через смену суток, то надо заранее поставить условие.
Например так:
Код:
$Hour = @HOUR + 2
If $Hour > 23 Then $Hour -= 24
Run (@SystemDir & '\schtasks.exe /change /TN "2nd Task_name" /ST ' & StringFormat ("%02d:%02d", $Hour, $Min))

Сообщение автоматически объединено:

Отличное решение... забираю!
на счёт 2й части - я по сути уже это и сделал... но спасибо за совет...
 

Oki

Продвинутый
Сообщения
452
Репутация
63
Разве не осталась проблема того, что нужно остаться в формате hh? То есть из входного в формате hh нужно получить выходной в том же формате. Это можно решить вот таким приёмом.
Код:
$sIn = InputBox("", "Keep the current hour or input another one in the format 'hh' for a test.", @HOUR)
$sHours = "00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|00|01"
MsgBox(4096, "", StringMid($sHours, StringInStr($sHours, $sIn) + 6, 2))
 
Последнее редактирование:
Автор
J

JohnWind

Новичок
Сообщения
58
Репутация
0
Разве не осталась проблема того, что нужно остаться в формате hh? То есть из входного в формате hh нужно получить выходной в том же формате. Это можно решить вот таким приёмом.
Код:
$sIn = InputBox("", "Keep the current hour or input another one in the format 'hh' for a test.", @HOUR)
$sHours = "00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|00|01"
MsgBox(4096, "", StringMid($sHours, StringInStr($sHours, $sIn) + 6, 2))
на сколько я понял - такое форматирование как
Код:
"%02d:%02d", ...
как раз решает проблему
 
Верх