![]() |
Сокращение / оптимизация скрипта проверки состояния и запуска служб MU
Суть: есть скрипт определения состояния служб, ответственных за запуск MU. Кроме того, скрипт позволяет сделать оптимизацию служб, если их конфигурация не позволяет работать MU. Предусмотрен также откат на старые настройки (сделал обновление и снова вернул службы в исходное положение)
Проблема: 1. 2. скрипт получился слишком громоздким. Имхо, мне кажется, что его можно значительно сократить (м.б. за счет использование массивов?). Это прежде всего касается следующих блоков скрипта: а) Func _ServicesStat() б) Func _SaveOld() Как мне кажется, эти бесконечные case и If -> Endif - не совсем грамотный путь. |
проблему удалось решить только так:
1. заменил код: Код:
Func _SaveOld() 2. заменил код: Код:
Func _RestoreOld() Код:
Func _RestoreOld() Цитата:
|
Цитата:
- туманное и нечеткое описание задач скрипта; - скрипт "сходу" нерабочий (ошибки отсутствия .AU3, переменных и т.п.); - отсутствуют комментарии/структурирование кода ...Вы всё еще чему-то удивляетесь? |
amel27 & ALL, извините, исправляюсь:
1. версия autoit 3.3.6.1 2. задачи скрипта: 1. индикация состояния служб, необходимых для работы MU (зеленые иконки - соответсвуют, красные -нет) 2. по нажатию на кнопки совершить следующие действия: - кнопка"Сохранить" - сохранение текущей конфигурации "типа запуска" служб (т.е. конфигурация, которая у юзера поумолчанию) - кнопка "Старт" - изменение (если необходимо) умолчальных конфигураций служб на конфигурации, которые позволяют MU работать (включая не только изменение типа запуска, но и сам старт служб) - кнопка "Откат" - если необходимо, позволяют юзеру откатить "новые" настройки (тип запуска) на те, которые у него раньше были (важно, если работаешь на чужом ПК или сам не хочешь держать автообновление и проч. в автозагрузке). 3. скрипт рабочий, но необходимо качать архив mu_services.7z, т.к. без иконок, Вы не увидите его работу. Код был выложен для общей информации и без иконок он работать не будет. кроме того, каюсь, забыл вложить Icons.au3. 4. комментарии добавил,архив перезалил (см. шапку). Заранее спасибо |
Цитата:
1. сохранял бы состояние служб не в переменных, а в файле или реестре; 2. избавился от внешней утилиты SC, варианты - реестр, WMI, API; 3. вместо конструкции Select/Case активней использовал массивы (параметризация); 4. только нужные ф-ции из Icons.AU3 перенес в основной код скрипта 5. подключил иконки как ресурс EXE-файла что Вы думаете по этому поводу? |
amel27, мда.... не все понял, но:
1. вопрос в том, что я хочу сделать утилиту, которая бы не следила на машшине, т.е. , по возможности, никаких доп. изменений 2. sc - вынужденная необходимость. ввел, когда не получилось изменить через RegWrite тип запуска Автоматического обновления. Плюс -утилита присутствует как в xp, так и в win7 3. массивы пока только планирую начать изучать (я так понял, что нужно смотреть все функции с _Array) Если не затруднит, то можно дать направление, что делать мне в данном случае или, даже, пример 4. если можно, то почему так будет лучше? Меньше весить будет или еще что-то? Просто, этот скрипт- часть утилиты, которую я пытаюсь сделать (там 6 вкладок и уже много инклюдов) и для меня этот вопрос очень важен.. 5. не совсем понял? это через file instal или как? |
1. дело вкуса, можно и в TEMP... но если скрипт зависнет, все сохранения пропадут
2. насколько помню, Вы его использовали неправильно, но запустить службу через реестр всё равно не выйдет, проще всего через WMI 3. нет, без всяких библиотек, эквивалентен такому: Код:
Dim $aSvcState[5]=['boot','','auto','demand','disabled'] 5. AutoIt Wrapper GUI - Расширенная компиляция скриптов |
amel27,
по п.2 - там была проблема с переключением "типа запуска" Автообновления, а не сам запуск. Т.е. не отрабатывал такой вариант: Код:
$Save_MU = $sLog1_2 1. создается массив из 5 элементов (boot, system, auto, demand, disabled) Dim $aSvcState[5]=['boot','system','auto','demand','disabled'] 2. идет присвоение переменным: $Save_MU - присваивается значение элемента массива $aSvcState[$sLog1_2], причем, насколько я понял [$sLog1_2] -это порядковый номар элемента? Т.е. если $sLog1_2 = 2, то выбирается 2 номер, т.е. auto... и так далее Правильно? |
|
amel27, на эту же тему - попробЫвал также переделать код с иконками (пришлось делать многомерный массив, т.к. разные условия):
на: Код:
Dim $aState1[3][4]=[['error.ico','','','ok.ico'], ['','ok.ico','error.ico','error.ico'], ['','ok.ico','ok.ico','error.ico']] Код:
C:\Documents and Settings\?????????????\??????? ????\Hotfixes2-1.au3 (145) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.: |
Цитата:
- при обращению к элементу массива указывается ИНДЕКС элемента в массиве; - значение индекса изменяется от 0 до N-1 (N- кол-во элементов в массиве) ...но в данном случае можно обойтись одним массивом: Код:
Dim $aIcons[2]=['error.ico','ok.ico'] |
amel27, нельзя. Там разные условия:
для 1_1 и 3_1 - да, можно (состояние либо 4 либо 1) для 1_2 и 3_2 - 2,3,4. Причем только 2 = ok.icon для 2_2 - 2,3,4. Но только 2 и 3 = ok.ico Поэтому одномерным не обойтись... |
saavaage, когда условие в скобках истинно, выбирается 2-й элемент, иначе 1-й... тут главное логическое выражение правильно составить... ;)
|
amel27,
немного запутался. У Вас: Цитата:
Заранее благодарен Цитата:
amel27, в принципе я, наконец понял. Вы имели ввиду, что если $sLog1_1=4, то выбирается ok.ico, иначе error.ico. Правильно? код: Код:
Dim $aIcons[2]=['error.ico','ok.ico'] |
Цитата:
выражение ($sLog1_1=4) равно 1 (True), когда значение $sLog1_1 равно 4, и 0 (False) во всех остальных случаях Цитата:
Код:
$picx_x=$aIcons[(($sLogx_x=2) Or ($sLogx_x=3))] |
amel27, у меня вроде нормально отработал и такой вариант
Код:
$pic2_2=$aIcons[$sLog2_2=3 or $sLog2_2=2] PS а как, все-таки, надо было написать в случае многомерного массива (мой неправильный вариант) |
|
Цитата:
Цитата:
Код:
Dim $aState1[3][5]=[ _ |
Вложений: 1
amel27, рано я радовался.
Неожиданно возникла проблема при добавлении вкладки "Devices" (в коде выделил жирным). При нажатии на кнопки "Обновить", "Старт" и "Откат" происходит "прорисовка" иконок на этой вкладке. Промучился весь день и никак не смог это разрешить. Понятно, что это происходит потому, что у меня в эти функции ( _HotFixes_Update(), _StartOptim() и _RestoreOld() ) вставлен запуск _ServicesStat() для обновления информации о службах и, соответственно, иконках. Если его (запуск) закомментировать, то все нормально, но тогда нет обновления иконок после этих операций (обновить, старт и откат). Вот код: Буду признателен за любую подсказку... PS на всякий случай, прикрепил архив с иконками и Icons.au3 (без них скрипт не сработает!) |
Решение предложено Yashied на русском форуме http://autoit-script.ru/index.php/to....html#msg18794
Вот адаптированный под мой скрипт код: Т.о. тема решена. Еще раз спасибо за помощь amel27 и Yashied. |
Время: 03:33. |
Время: 03:33.
© OSzone.net 2001-