Что нового

Скрипт запускающий экзешник раз в 7 дней

SergVrn

Новичок
Сообщения
87
Репутация
2
Здравствуйте.
Помогите решить проблему.

Помогите написать скрипт, который бы висел постоянно в трее и запускал бы определенный экзешник и проигрывал бы звук tada.wav - единократно каждую неделю.
(каждый час - скрипт записывает текущую дату в текстовый файл Дата.txt и проверяет прошло ли уже 7 дней с предыдущего срабатывания - чтобы принять решение запускать экзешник из настроек или нет).

Данные по запускаемому экзешнику и звуковому файлу - нужно взять из файла Настройки.ini, который лежит рядом со скриптом.
Там записано:
экзешник=c:\Windows\System32\calc.exe
звук=c:\Windows\Media\tada.wav
 

Вложения

  • Настройки.rar
    156 байт · Просмотры: 3

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Как мне кажется, нужен доступ к абсолютному времени. То есть, скрипт берет время из интернета. Это позволяет исключить ошибку стстемного времени, например, отсутствие синхронизации
Или ручной перевод. А так же, если комп выключен несколько дней.
То есть, при первом запуске скрипт опрашивает интернет ресурс и запись в файл. А потом уже сравнение с записанной датой.
Скрипт не смотрел. Так, размышления
 
Автор
S

SergVrn

Новичок
Сообщения
87
Репутация
2
Ясно.
А как это скриптом сделать ?
 

lettterssino

Знающий
Сообщения
109
Репутация
10
Может быть глупо, а если попробовать через планировщик задач ?
 
Автор
S

SergVrn

Новичок
Сообщения
87
Репутация
2
Нет. Я спрашивал про скрипт автоит - нужно именно в нем.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
258
Репутация
66
Самый минимум ...
Код:
#include <Date.au3>
#include <Sound.au3>

;содержание файла настроек
;
;[Settings]
;ExeFile=C:\Windows\System32\notepad.exe
;SoundFile=C:\Windows\Media\tada.wav

;путь к файлу с настройками
Global $sIniFile = 'Settings.ini'
;считываем из файла настроек путь к файлу программы
Global $sExeFile = IniRead($sIniFile, 'Settings', 'ExeFile', 'C:\Windows\System32\notepad.exe')
;считываем из файла настроек путь к аудио файлу
Global $sSoundFile = IniRead($sIniFile, 'Settings', 'SoundFile', 'C:\Windows\Media\tada.wav')
;считываем из файла настроек дату последнего запуска файла программы
Global $sPrevData = IniRead($sIniFile, 'Settings', 'PrevData', '1970/01/01 00:00:00')
;
Global $sNextData = ''

While 1
     ;получаем текущую дату
     $sNextData = _NowCalc()
     ;сравниваем с предыдущей, прошла ли неделя
     If _DateDiff('w', $sPrevData, $sNextData) Then
          ;воспроизводим аудио файл
          _SoundPlay($sSoundFile)
          ;запускаем файл программу
          Run($sExeFile)
          ;запоминаем дату последнего запуска файла программы
          $sPrevData = $sNextData
          ;записываем в файл настроек дату последнего запуска файла программы
          IniWrite($sIniFile, 'Settings', 'PrevData', $sPrevData)
     EndIf
     ;засыпаем на одну минуту
     Sleep(60000)
WEnd
 
Последнее редактирование:
Автор
S

SergVrn

Новичок
Сообщения
87
Репутация
2
Скрипт запустился, один раз при запуске открыл экзешник.... и повис в трее.
За час - ничего не открыл.
Хотя в листинге записано: ";засыпаем на одну минуту"
То есть через минуту скрипт должен был опять запустить экзешник.
Но этого не происходит

Или он только через неделю должен сработать ?
В коде где-нибудь записано - через сколько скрипт запустит экзешник ?
 

IMStrelcov

CTPEJIbLLOB
Сообщения
258
Репутация
66
Или он только через неделю должен сработать ?
Да следующий запуск EXE-файла через неделю, а каждую минуту скрипт просто проверяет прошла ли эта неделя.
Почему каждую минуту, а не час или день?
Может быть, что после последнего запуска скрипта вы выключили комп.
После как включили и запустили скрипт, а на этот момент прошло 6 дней 23 часа 59 минут, т.е. неделя еще не прошла, и скрипт ушел в сон на час, день и т.д.
Чтобы избежать такой ситуации, скрипт проверяет прошла ли неделя раз в минуту.

И так для справки, время берется системное, а не из инета.
 
Автор
S

SergVrn

Новичок
Сообщения
87
Репутация
2
Чтобы избежать такой ситуации, скрипт проверяет прошла ли неделя раз в минуту
Понятно, спасибо.
А какую строчку в скрипте изменить - чтобы поменять неделю - на другой срок (например 1 день) ?
 
Автор
S

SergVrn

Новичок
Сообщения
87
Репутация
2

All2khoff,​

А как тут сменить временной период неделю - например на временной период 6 дней ?
 
Автор
S

SergVrn

Новичок
Сообщения
87
Репутация
2
Функция _DateDiff Пройдите по ссылке и читайте там все понятно.
Понятно
w = Интервал в неделях между указанными датами
D = Интервал в днях между указанными датами
Если один день ждать - значит строка будет выглядеть так:
If _DateDiff('D', $sPrevData, $sNextData) Then

Но как ждать несколько дней - там не написано.
 

All2khoff

Продвинутый
Сообщения
352
Репутация
65
Но как ждать несколько дней - там не написано.
Код:
_dateadd

в условиях динамического подхода нужно не сравнивать дату между собой а отнимать от текущей и сравнивать не превышен ли предел в условные годы. месяцы, дни, часы, секунды.
Для меня такой формат удобней.
 
Автор
S

SergVrn

Новичок
Сообщения
87
Репутация
2
А, все ясно теперь.
Не обратил внимание.
Спасибо за подсказку.
 

Sergio

Новичок
Сообщения
41
Репутация
3
такие вещи делаются через планировщик, или запускают как сервис
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Почему каждую минуту, а не час или день?
Может быть, что после последнего запуска скрипта вы выключили комп.
После как включили и запустили скрипт, а на этот момент прошло 6 дней 23 часа 59 минут, т.е. неделя еще не прошла, и скрипт ушел в сон на час, день и т.д.
А можно проверить на старте 1 раз и дальше не проверять каждую минуту. Так как комп может быть выключен, то конечно дата следующего вызова должна быть сохранена в файл. Обязательно должно использоваться не "=" а "<" так как можно проскочить дату разными способами. У меня в андроид программе из-за непонятных причин пропуска даты я сделал алгоритм проверки каждые пол-оставшегося времени, то есть если осталась неделя то я делаю таймер проверки через 3,5 дня, потом 1, 75 и так до часа, потом до минуты, то есть за 2 часа до конца таймера делаю проверку через час, за 2 минуты до таймера делаю проверку за минуту. В компе думаю такой заворочки делать не надо.
Если разберёшься с исходником, то посмотри мой исходник от программы podarok, там немного другое поведение, предполагает что комп выключается, поэтому если дата не пришла прога просто сам выключится, находясь в автозагрузке. И там используется дата запуска, а не период через сколько... Но думаю будет интересным разбор даты и сравнение, так как запустившись программа запускает действие не сразу, а учитывает время, например в 12 часов, то есть тоже выжидательная позиция.
 
Верх