Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Сокращение / оптимизация скрипта проверки состояния и запуска служб MU

Ответить
Настройки темы
[решено] Сокращение / оптимизация скрипта проверки состояния и запуска служб MU

Ветеран


Сообщения: 903
Благодарности: 161


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: saavaage
Дата: 30-09-2010
Суть: есть скрипт определения состояния служб, ответственных за запуск MU. Кроме того, скрипт позволяет сделать оптимизацию служб, если их конфигурация не позволяет работать MU. Предусмотрен также откат на старые настройки (сделал обновление и снова вернул службы в исходное положение)
Проблема:
1. почему-то не отрабатывает "откат" по службе "Автоматическое обновление". - решено

2. скрипт получился слишком громоздким. Имхо, мне кажется, что его можно значительно сократить (м.б. за счет использование массивов?). Это прежде всего касается следующих блоков скрипта:
а) Func _ServicesStat()
б) Func _SaveOld()

Как мне кажется, эти бесконечные case и If -> Endif - не совсем грамотный путь.

-------
мы рождены, чтоб сказку сделать былью


Отправлено: 05:13, 26-08-2010

 

Ветеран


Сообщения: 903
Благодарности: 161

Профиль | Отправить PM | Цитировать


проблему удалось решить только так:
1. заменил код:
Код: Выделить весь код
Func _SaveOld()
 GUICtrlSetState($Button_Save, $GUI_DISABLE)
 $Save_Event = $sLog3_2
 $Save_BITS = $sLog2_2
 $Save_MU = $sLog1_2
 sleep(1000)
 GUICtrlSetState($Button_Save, $GUI_ENABLE)
EndFunc
на:
читать дальше »
Код: Выделить весь код
Func _SaveOld()
 GUICtrlSetState($Button_Save, $GUI_DISABLE)
 Select
    Case $sLog1_2 = '2'
        $Save_MU = 'auto'
	Case $sLog1_2 = '3'
        $Save_MU = 'demand'
	Case $sLog1_2 = '4'
        $Save_MU = 'disabled'
	Case $sLog1_2 = '0'
        $Save_MU = 'boot'
	Case Else
        $Save_MU = 'system'
EndSelect

 Select
    Case $sLog2_2 = '2'
        $Save_BITS = 'auto'
	Case $sLog2_2 = '3'
        $Save_BITS = 'demand'
	Case $sLog2_2 = '4'
        $Save_BITS = 'disabled'
	Case $sLog2_2 = '0'
        $Save_BITS = 'boot'
	Case Else
        $Save_BITS = 'system'
EndSelect

 Select
    Case $sLog3_2 = '2'
        $Save_Event = 'auto'
	Case $sLog3_2 = '3'
        $Save_Event = 'demand'
	Case $sLog3_2 = '4'
        $Save_Event = 'disabled'
	Case $sLog3_2 = '0'
        $Save_Event = 'boot'
	Case Else
        $Save_Event = 'system'
EndSelect
 sleep(1000)
 GUICtrlSetState($Button_Save, $GUI_ENABLE)
EndFunc


2. заменил код:

Код: Выделить весь код
Func _RestoreOld()
 GUICtrlSetState($Button_Restore, $GUI_DISABLE)
 RunWait(RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog', 'Start', 'REG_DWORD', $Save_Event))
 RunWait(RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\muauserv', 'Start', 'REG_DWORD', $Save_MU))
 RunWait(RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BITS', 'Start', 'REG_DWORD', $Save_BITS))
  sleep(1000)
 _ServicesStat()
 sleep(1000)
 GUICtrlSetState($Button_Restore, $GUI_ENABLE)
EndFunc
на:
Код: Выделить весь код
Func _RestoreOld()
 GUICtrlSetState($Button_Restore, $GUI_DISABLE)
 RunWait('sc config eventlog start= ' & $Save_Event &'', '', @SW_HIDE)
 RunWait('sc config wuauserv start= ' & $Save_MU &'', '', @SW_HIDE)
 RunWait('sc config BITS start= ' & $Save_BITS &'', '', @SW_HIDE)
  sleep(1000)
 _ServicesStat()
 sleep(1000)
 GUICtrlSetState($Button_Restore, $GUI_ENABLE)
EndFunc
Может кто-нибудь все-таки поможет в плане
Цитата saavaage:
как мне кажется, скрипт можно сократить (смущает большое количество однотипных операций). »

-------
мы рождены, чтоб сказку сделать былью


Последний раз редактировалось saavaage, 27-08-2010 в 14:03.


Отправлено: 13:47, 27-08-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Googler


Сообщения: 3665
Благодарности: 1561

Профиль | Отправить PM | Цитировать


Цитата saavaage:
Может кто-нибудь все-таки поможет »
- не указана версия AutoIT, на котором проводится отладка;
- туманное и нечеткое описание задач скрипта;
- скрипт "сходу" нерабочий (ошибки отсутствия .AU3, переменных и т.п.);
- отсутствуют комментарии/структурирование кода

...Вы всё еще чему-то удивляетесь?

-------
Как сообщить о том, что моя проблема решена?
не оказываю техподдержку через ПМ/ICQ/Mail - для этого есть форум


Отправлено: 10:56, 29-08-2010 | #3


Ветеран


Сообщения: 903
Благодарности: 161

Профиль | Отправить PM | Цитировать


amel27 & ALL, извините, исправляюсь:
1. версия autoit 3.3.6.1
2. задачи скрипта:
1. индикация состояния служб, необходимых для работы MU (зеленые иконки - соответсвуют, красные -нет)
2. по нажатию на кнопки совершить следующие действия:
- кнопка"Сохранить" - сохранение текущей конфигурации "типа запуска" служб (т.е. конфигурация, которая у юзера поумолчанию)
- кнопка "Старт" - изменение (если необходимо) умолчальных конфигураций служб на конфигурации, которые позволяют MU работать (включая не только изменение типа запуска, но и сам старт служб)
- кнопка "Откат" - если необходимо, позволяют юзеру откатить "новые" настройки (тип запуска) на те, которые у него раньше были (важно, если работаешь на чужом ПК или сам не хочешь держать автообновление и проч. в автозагрузке).
3. скрипт рабочий, но необходимо качать архив mu_services.7z, т.к. без иконок, Вы не увидите его работу. Код был выложен для общей информации и без иконок он работать не будет. кроме того, каюсь, забыл вложить Icons.au3.
4. комментарии добавил,архив перезалил (см. шапку).

Заранее спасибо

-------
мы рождены, чтоб сказку сделать былью


Последний раз редактировалось saavaage, 30-08-2010 в 17:55.


Отправлено: 17:39, 30-08-2010 | #4


Googler


Сообщения: 3665
Благодарности: 1561

Профиль | Отправить PM | Цитировать


Цитата saavaage:
скрипт получился слишком громоздким »
поверьте, четыре страницы это не много, тут важно не переусердствовать: излишнее сокращение кода (обычно делается через параметризацию) неизбежно ухудшает читабельность и гибкость, т.е. увеличивает затраты на его восприятие и последующие изменения... уменьшить количество текста на файл можно разделением скрипта на несколько файлов (по функциям) и загрузкой их через INCLUDE... Теперь по-существу дела - что бы я попытался изменить в скрипте:

1. сохранял бы состояние служб не в переменных, а в файле или реестре;
2. избавился от внешней утилиты SC, варианты - реестр, WMI, API;
3. вместо конструкции Select/Case активней использовал массивы (параметризация);
4. только нужные ф-ции из Icons.AU3 перенес в основной код скрипта
5. подключил иконки как ресурс EXE-файла

что Вы думаете по этому поводу?

-------
Как сообщить о том, что моя проблема решена?
не оказываю техподдержку через ПМ/ICQ/Mail - для этого есть форум


Отправлено: 11:45, 31-08-2010 | #5


Ветеран


Сообщения: 903
Благодарности: 161

Профиль | Отправить PM | Цитировать


amel27, мда.... не все понял, но:

1. вопрос в том, что я хочу сделать утилиту, которая бы не следила на машшине, т.е. , по возможности, никаких доп. изменений
2. sc - вынужденная необходимость. ввел, когда не получилось изменить через RegWrite тип запуска Автоматического обновления. Плюс -утилита присутствует как в xp, так и в win7
3. массивы пока только планирую начать изучать (я так понял, что нужно смотреть все функции с _Array) Если не затруднит, то можно дать направление, что делать мне в данном случае или, даже, пример
4. если можно, то почему так будет лучше? Меньше весить будет или еще что-то? Просто, этот скрипт- часть утилиты, которую я пытаюсь сделать (там 6 вкладок и уже много инклюдов) и для меня этот вопрос очень важен..
5. не совсем понял? это через file instal или как?

-------
мы рождены, чтоб сказку сделать былью


Отправлено: 12:15, 31-08-2010 | #6


Googler


Сообщения: 3665
Благодарности: 1561

Профиль | Отправить PM | Цитировать


1. дело вкуса, можно и в TEMP... но если скрипт зависнет, все сохранения пропадут
2. насколько помню, Вы его использовали неправильно, но запустить службу через реестр всё равно не выйдет, проще всего через WMI
3. нет, без всяких библиотек,
например, следующий код

Код: Выделить весь код
Select
    Case $sLog1_2 = '2'
        $Save_MU = 'auto'
	Case $sLog1_2 = '3'
        $Save_MU = 'demand'
	Case $sLog1_2 = '4'
        $Save_MU = 'disabled'
	Case $sLog1_2 = '0'
        $Save_MU = 'boot'
	Case Else
        $Save_MU = 'system'
EndSelect

 Select
    Case $sLog2_2 = '2'
        $Save_BITS = 'auto'
	Case $sLog2_2 = '3'
        $Save_BITS = 'demand'
	Case $sLog2_2 = '4'
        $Save_BITS = 'disabled'
	Case $sLog2_2 = '0'
        $Save_BITS = 'boot'
	Case Else
        $Save_BITS = 'system'
EndSelect

 Select
    Case $sLog3_2 = '2'
        $Save_Event = 'auto'
	Case $sLog3_2 = '3'
        $Save_Event = 'demand'
	Case $sLog3_2 = '4'
        $Save_Event = 'disabled'
	Case $sLog3_2 = '0'
        $Save_Event = 'boot'
	Case Else
        $Save_Event = 'system'
EndSelect

эквивалентен такому:
Код: Выделить весь код
Dim $aSvcState[5]=['boot','','auto','demand','disabled']

$Save_MU   = $aSvcState[$sLog1_2]
$Save_BITS = $aSvcState[$sLog2_2]
$Save_Event= $aSvcState[$sLog3_2]
4. если ф-ций используется мало и они простые, можно их перенести в свой код, но придется разобраться в их работе, плюсы - лучшее понимание своего скрипта, а значит больший над ним контроль (в чужих библиотеках нередки ошибки или нестыковки с версиями AutoIT)
5. AutoIt Wrapper GUI - Расширенная компиляция скриптов

-------
Как сообщить о том, что моя проблема решена?
не оказываю техподдержку через ПМ/ICQ/Mail - для этого есть форум


Отправлено: 12:52, 31-08-2010 | #7


Ветеран


Сообщения: 903
Благодарности: 161

Профиль | Отправить PM | Цитировать


amel27,
по п.2 - там была проблема с переключением "типа запуска" Автообновления, а не сам запуск. Т.е. не отрабатывал такой вариант:
Код: Выделить весь код
 $Save_MU = $sLog1_2
RunWait(RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\muauserv', 'Start', 'REG_DWORD', $Save_MU))
по п.3 -спасибо, супер! Можно немного "разжевать" суть процесса. Я понимаю так:
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... и так далее
Правильно?

-------
мы рождены, чтоб сказку сделать былью


Отправлено: 13:27, 31-08-2010 | #8


Googler


Сообщения: 3665
Благодарности: 1561

Профиль | Отправить PM | Цитировать


Цитата saavaage:
не отрабатывал такой вариант »
RunWait не нужен для запуска штатной ф-ции AutoIT:
Код: Выделить весь код
RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\muauserv', 'Start', 'REG_DWORD', $sLog1_2)
Цитата saavaage:
Правильно? »
угу, именно так и используются массивы

-------
Как сообщить о том, что моя проблема решена?
не оказываю техподдержку через ПМ/ICQ/Mail - для этого есть форум


Отправлено: 14:14, 31-08-2010 | #9


Ветеран


Сообщения: 903
Благодарности: 161

Профиль | Отправить PM | Цитировать


amel27, на эту же тему - попробЫвал также переделать код с иконками (пришлось делать многомерный массив, т.к. разные условия):

читать дальше »
Код: Выделить весь код
 IF $sLog1_1 = 4 Then
	  $pic1_1 = 'ok.ico'
	  _ImageGet()
     ELSE
	   $pic1_1 = 'error.ico'
	  _ImageGet()
   EndIf

   IF $sLog3_1 = 4 Then
	   $pic3_1 = 'ok.ico'
	  _ImageGet()
    ELSE
	   $pic3_1 = 'error.ico'
	  _ImageGet()
   EndIf

   IF $sLog1_2 = 2 Then
	  $pic1_2 = 'ok.ico'
	  _ImageGet()
    ELSE
	  $pic1_2 = 'error.ico'
	  _ImageGet()
   EndIf
IF $sLog2_2 = 4 Then
$pic2_2 = 'error.ico'
_ImageGet()
ELSE
$pic2_2 = 'ok.ico'
_ImageGet()
EndIf[/code]


на:

Код: Выделить весь код
Dim $aState1[3][4]=[['error.ico','','','ok.ico'], ['','ok.ico','error.ico','error.ico'], ['','ok.ico','ok.ico','error.ico']]
$pic1_1 = $aState1[1][$sLog1_1]
$pic3_1 = $aState1[1][$sLog3_1]
$pic1_2 = $aState1[2][$sLog1_2]
$pic2_2 = $aState1[3][$sLog2_2]
$pic3_2 = $aState1[2][$sLog3_2]
_ImageGet()
и выдало ошибку

Код: Выделить весь код
C:\Documents and Settings\?????????????\??????? ????\Hotfixes2-1.au3 (145) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
$pic1_1 = $aState1[1][$sLog1_1]
$pic1_1 = ^ ERROR

-------
мы рождены, чтоб сказку сделать былью


Отправлено: 15:54, 31-08-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Сокращение / оптимизация скрипта проверки состояния и запуска служб MU

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Установка - оптимизация alik777 Microsoft Windows 2000/XP 1 24-07-2010 22:58
[решено] Оптимизация JS скрипта System Failure Вебмастеру 2 12-10-2009 21:29
Службы - Оптимизация Malfatto Microsoft Windows Vista 2 06-09-2008 15:08
Оптимизация файлов Slim-UB Автоматическая установка Windows 2000/XP/2003 7 13-06-2006 15:33
Оптимизация pashka-88 Хочу все знать 2 30-10-2005 20:49




 
Переход