1 (изменено: Dr.Jekyll, 2015-04-01 09:45:28)

Тема: AHK: Ежемесячное однократное выполнение задачи

Добрый всем день!

Написал скрипт на ежемесячный сброс статистики 3G модема на ноуте. Собсна, вот код:

#NoEnv
#SingleInstance force
SetBatchLines -1

If !A_IsAdmin
    {
    Run *RunAs "%A_ScriptFullPath%"
    ExitApp
    }
;__________________________________________________________________________________________________________________
; TrayMenu

Menu Tray, NoStandard
Menu Tray, Tip, Huawei Statistics Reset
Menu Tray, Add, Автозапуск с Windows, SwitchAutoLaunch
Menu Tray, Add
Menu Tray, Add, Выйти из программы, CloseProg
Menu Tray, Default, Выйти из программы

RegRead AutoLaunch, HKCU, Software\Microsoft\Windows\CurrentVersion\Run, HuaweiStatisticsReset
If !AutoLaunch ; Добавляем Huawei Statistics Reset в автозапуск
    {
    RegWrite REG_SZ, HKCU, Software\Microsoft\Windows\CurrentVersion\Run, HuaweiStatisticsReset, % """" . A_ScriptFullPath . """"
    }
AutoLaunchOn := 1 ; Метка для проверки автозапуска SwitchAutoLaunch
Menu Tray, Check, Автозапуск с Windows
GoSub Tasks
;__________________________________________________________________________________________________________________
; Переключение автозапуска

SwitchAutoLaunch:
If AutoLaunchOn
    {
    RegDelete HKCU, Software\Microsoft\Windows\CurrentVersion\Run, HuaweiStatisticsReset
    AutoLaunchOn := ""
    Menu Tray, UnCheck, Автозапуск с Windows
    }
    Else
        {
        RegWrite REG_SZ, HKCU, Software\Microsoft\Windows\CurrentVersion\Run, HuaweiStatisticsReset, % """" . A_ScriptFullPath . """"
        AutoLaunchOn := 1
        Menu Tray, Check, Автозапуск с Windows
        }
return
;__________________________________________________________________________________________________________________
; Выполнение задач

Tasks:
If A_DD = 01 ; Выполнение задач первого числа каждого месяца
    {
    RegRead HuaweiPath, HKLM, SOFTWARE\Wow6432Node\Huawei technologies\HUAWEI Modem Nano, ExePath ; Получение из реестра директории установленной HUAWEI Modem Nano
    If HuaweiPath
        {
        FileDelete % HuaweiPath . "\userdata\NetInfo.dat" ; Удаление статискики трафика за прошедший месяц
        }
    }
    
Sleep % ((23-A_Hour)*3600000+(59-A_Min)*60000+(60-A_Sec)*1000)*+1 ; Отсчет времени до полуночи
GoSub Tasks
;__________________________________________________________________________________________________________________

CloseProg:
ExitApp

Все работает, но криво. Недостаки:
1. Удаляет статистику при каждом включении или перезагрузке ноута первого числа месяца.
2. Если не включать ноут в первый день месяца, то сброс статистики вообще не происходит.

Как исправить это? Нужно сделать однократное удаление файла "NetInfo.dat" первого числа каждого месяца, а если ноут не влючался в это время, то удаление при первом включении вначале месяца.

Нужна идея. Самому ничего в голову не идет.

Лучше день потерять, потом за пять минут долететь!

2

Re: AHK: Ежемесячное однократное выполнение задачи

Например, при удалении пишите в реестр номер текущего месяца. При запуске скрипт будет сравнивать эту запись с текущим месяцем. Если совпадают, ничего не делать. Если не совпадают, удалить.

3 (изменено: Dr.Jekyll, 2015-04-01 10:01:27)

Re: AHK: Ежемесячное однократное выполнение задачи

Я над этим думал, но тогда все-равно статистика будет удаляться при каждом включении или при перезагрузке ноута первого числа ... или я совсем туплю ...

Лучше день потерять, потом за пять минут долететь!

4

Re: AHK: Ежемесячное однократное выполнение задачи

Допустим, начался февраль, при каждом включении скрипта вы проверяете есть ли в регистре 02, если нету то стираете 01(январь) и прописываете 02. Если уже стоит 02, то ничего не стираете и ждете марта.

5

Re: AHK: Ежемесячное однократное выполнение задачи

Dr.Jekyll пишет:

Я над этим думал, но тогда все-равно статистика будет удаляться при каждом включении или при перезагрузке ноута первого числа ... или я совсем туплю ...

Проверяется не число, а месяц.

6

Re: AHK: Ежемесячное однократное выполнение задачи

Malcev
Регистр — это такая ячейка памяти в процессоре.

7

Re: AHK: Ежемесячное однократное выполнение задачи

YMP, спасибо, учту.

8 (изменено: Dr.Jekyll, 2015-04-01 10:58:44)

Re: AHK: Ежемесячное однократное выполнение задачи

Ну да! Конечно! ... Наконец-то дошло, как до жирафа!

"If A_DD = 01" здесь совсем неуместно! Надо номер месяца в реестр писать и проверять! ...

Всем СПАСИБО за помощь!

Лучше день потерять, потом за пять минут долететь!

9 (изменено: Dr.Jekyll, 2015-04-03 13:17:14)

Re: AHK: Ежемесячное однократное выполнение задачи

Сваял! Теперь все работает правильно. Задача выполняется только один раз в месяц независимо от выключений или перезагрузок компа первого числа (если в это время был включен комп или при первом его включении в новом месяце). Если же его совсем не выключать, то все будет выполнено в 00:00:01 часов первого числа каждого месяца.

Если кому-нибудь нужно, выкладываю рабочий код:

#NoEnv
#SingleInstance force
SetBatchLines -1

If !A_IsAdmin
    {
    Run *RunAs "%A_ScriptFullPath%"
    ExitApp
    }
;__________________________________________________________________________________________________________________
; TrayMenu

Menu Tray, NoStandard
Menu Tray, Tip, Monthly Tasks
Menu Tray, Add, Автозапуск с Windows, SwitchAutoLaunch
Menu Tray, Add
Menu Tray, Add, Выйти из программы, CloseProg
Menu Tray, Default, Выйти из программы

RegRead AutoLaunch, HKCU, Software\Microsoft\Windows\CurrentVersion\Run, MonthlyTasks
    If !AutoLaunch ; Добавление Monthly Tasks в автозапуск
        {
        RegWrite REG_SZ, HKCU, Software\Microsoft\Windows\CurrentVersion\Run, MonthlyTasks, % """" . A_ScriptFullPath . """"
        }
AutoLaunchOn := 1 ; Метка для проверки автозапуска SwitchAutoLaunch
Menu Tray, Check, Автозапуск с Windows
GoTo Tasks
;__________________________________________________________________________________________________________________
; Переключение автозапуска

SwitchAutoLaunch:
If AutoLaunchOn
    {
    RegDelete HKCU, Software\Microsoft\Windows\CurrentVersion\Run, MonthlyTasks
    AutoLaunchOn := ""
    Menu Tray, UnCheck, Автозапуск с Windows
    }
    Else
        {
        RegWrite REG_SZ, HKCU, Software\Microsoft\Windows\CurrentVersion\Run, MonthlyTasks, % """" . A_ScriptFullPath . """"
        AutoLaunchOn := 1
        Menu Tray, Check, Автозапуск с Windows
        }
return
;__________________________________________________________________________________________________________________
; Выполнение задач

Tasks:
FormatTime NextMonth, % A_Year Chr(48*(A_MM = 12)) A_MM+1, MMMM ; Получение имени следующего месяца
RegRead NextTasks, HKCU, Software\MonthlyTasks, NextTasks
    If !NextTasks ; Создание записи для выполнения задач в следующем месяце (при первом запуске Monthly Tasks)
        {
        RegWrite REG_SZ, HKCU, Software\MonthlyTasks, NextTasks, % NextMonth
        }
        
If A_MMMM = % NextTasks ; Выполнение задач вначале каждого месяца
    {
    RegRead HuaweiPath, HKLM, SOFTWARE\Wow6432Node\Huawei technologies\HUAWEI Modem Nano, ExePath ; Получение из реестра Path установленной HUAWEI Modem Nano
        If HuaweiPath
            {
            FileDelete % HuaweiPath . "\userdata\NetInfo.dat" ; Удаление файла статистики трафика за прошедший месяц
            SplashTextOn 440, 60, Monthly Tasks, `nПроизведен ежемесячный сброс статистики 3G модема Huawei !
            Sleep 3000
            SplashTextOff
            }
    RegWrite REG_SZ, HKCU, Software\MonthlyTasks, NextTasks, % NextMonth ; Создание записи для выполнения задач в следующем месяце
    }
    
Sleep % ((23-A_Hour)*3600000+(59-A_Min)*60000+(60-A_Sec)*1000)*+1 ; Отсчет времени до полуночи (нужно, если комп работает круглосуточно)
GoTo Tasks
;__________________________________________________________________________________________________________________

CloseProg:
ExitApp

Здесь все закомментировано и будет несложно разобраться. Скрипт можно приспособить и под другие нужды или на выполнение сразу нескольких задач.

Еще раз благодарю YMP и Malcev за помощь!

Лучше день потерять, потом за пять минут долететь!

10

Re: AHK: Ежемесячное однократное выполнение задачи


GoSub Tasks

Тут нужно использовать GoTo, т.к. из процедуры Tasks нет возврата (команды Return). Поэтому делать вызов её нет смысла, нужно просто на неё переходить.

11

Re: AHK: Ежемесячное однократное выполнение задачи

А чем способ с постоянно запущенным скриптом лучше встроенного в Win планировщика заданий?

+ открыть спойлер

http://savepic.net/6580869.png

12 (изменено: Dr.Jekyll, 2015-04-03 13:35:17)

Re: AHK: Ежемесячное однократное выполнение задачи

Спасибо, YMP, переделал.

Irbis пишет:

А чем способ с постоянно запущенным скриптом лучше встроенного в Win планировщика заданий?

1. Не люблю виндюжатные "приложения".
2. Этот скрипт один раз настроил и будет работать всегда, а "планировщик" надо каждый раз настраивать после сноса винды. Она у меня долго не держится из-за моих экспериментов (в отличие от Linux).
3. ... а это кому-что нравится - должна быть альтернатива.
4. Можно подсунуть кому-нибудь в комп "сюрприз" (естественно, сделав скрипт незаметным и скомпилить в exe)
5. ... да мало-ли еще для чего кому-нибудь пригодится, что не может "планировщик" ...

Лучше день потерять, потом за пять минут долететь!