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

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

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

Ветеран


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


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

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


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

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

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

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


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

 

Googler


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

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


Цитата saavaage:
выдало ошибку »
- в команде Dim указывается КОЛИЧЕСТВО элементов в массиве;
- при обращению к элементу массива указывается ИНДЕКС элемента в массиве;
- значение индекса изменяется от 0 до N-1 (N- кол-во элементов в массиве)

...но в данном случае можно обойтись одним массивом:
Код: Выделить весь код
Dim $aIcons[2]=['error.ico','ok.ico']
$pic1_1=$aIcons[$sLog1_1=4]
$pic3_1=$aIcons[$sLog3_1=4]
$pic1_2=$aIcons[$sLog1_2=2]
_ImageGet()
Это сообщение посчитали полезным следующие участники:

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



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

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


Ветеран


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

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


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
Поэтому одномерным не обойтись...

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


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


Googler


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

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


saavaage, когда условие в скобках истинно, выбирается 2-й элемент, иначе 1-й... тут главное логическое выражение правильно составить...
Это сообщение посчитали полезным следующие участники:

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


Ветеран


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

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


amel27,
немного запутался. У Вас:
Цитата amel27:
Dim $aIcons[2]=['error.ico','ok.ico']
$pic1_1=$aIcons[$sLog1_1=4]
$pic3_1=$aIcons[$sLog3_1=4]
$pic1_2=$aIcons[$sLog1_2=2]
_ImageGet() »
т.е. массив из 2-х значений. А при присвоении переменным значений элементов, элементы имеют индексы 4 и 2. Как такое возможно? Я, наверно, неправильно понимаю технологию процесса. Можете последний вопрос немного"разжевать"?

Заранее благодарен

Цитата amel27:
когда условие в скобках истинно, выбирается 2-й элемент, иначе 1-й »
а, если истинно 2 условия типа загрузки - авто и дефолт (т.е. 2 и 3)?

amel27, в принципе я, наконец понял. Вы имели ввиду, что если $sLog1_1=4, то выбирается ok.ico, иначе error.ico. Правильно?

код:
Код: Выделить весь код
Dim $aIcons[2]=['error.ico','ok.ico']
$pic1_1=$aIcons[$sLog1_1=4]
$pic3_1=$aIcons[$sLog3_1=4]
$pic1_2=$aIcons[$sLog1_2=2]
$pic2_2=$aIcons[$sLog2_2=3 or $sLog2_2=2]
$pic3_2=$aIcons[$sLog3_2=2]
_ImageGet()
А как, все-таки, надо было написать в случае многомерного (мой неправильный вариант)?

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


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


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


Googler


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

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


Цитата saavaage:
при присвоении переменным значений элементов, элементы имеют индексы 4 и 2 »
нет - только 0 и 1
выражение ($sLog1_1=4) равно 1 (True), когда значение $sLog1_1 равно 4, и 0 (False) во всех остальных случаях

Цитата saavaage:
а, если истинно 2 условия типа загрузки - авто и дефолт? »
Код: Выделить весь код
$picx_x=$aIcons[(($sLogx_x=2) Or ($sLogx_x=3))]
Это сообщение посчитали полезным следующие участники:

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


Ветеран


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

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


amel27, у меня вроде нормально отработал и такой вариант

Код: Выделить весь код
$pic2_2=$aIcons[$sLog2_2=3 or $sLog2_2=2]
Нет, поспешил отчитаться.... Ваша правда. Спасибо Большое. Задача сокращения- оптимизации решена, благодаря Вам.

PS а как, все-таки, надо было написать в случае многомерного массива (мой неправильный вариант)

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


Последний раз редактировалось saavaage, 01-09-2010 в 17:00.


Отправлено: 17:33, 31-08-2010 | #16


Ветеран


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

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


Таким образом, оптимизированный/сокращенный код:

читать дальше »
Код: Выделить весь код
#include <ButtonConstants.au3>
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <Icons.au3>
#include <WinAPI.au3>

Global $pic1_1, $pic3_1, $pic1_2, $pic2_2, $pic3_2, $sLogI1_1, $sLogI1_2, $sLogI2_2, $sLogI3_1, $sLogI3_2
Global $Save_Event, $Save_MU, $Save_BITS, $sLog1_2, $sLog2_2, $sLog3_2, $sLog1_1, $sLog3_1

Opt("GUIOnEventMode", 1)

$hMain_GUI = GUICreate("Диагностика и Настройка", 619, 442, 189, 122)
GUISetIcon('Windows.ico', 1)
GUISetFont(8.5, 400, 0, 'MS Shell Dlg')
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

$Tab1 = GUICtrlCreateTab(8, 16, 601, 377)

;;;; Hotfixes ;;;;
$HotfixErrors = GUICtrlCreateTabItem("HotfixErrors")

$Button_HotFixesUpdate = GUICtrlCreateButton("Обновить", 84, 400, 60, 33, $BS_MULTILINE)
GUICtrlSetOnEvent($Button_HotFixesUpdate, "_HotFixes_Update")

; Работа со службами
GUICtrlCreateGroup("Службы, отвечающие за Автообновление", 16, 330, 370, 55)

GUICtrlCreateLabel("Автоматич. обновление", 24, 348, 75, 30, $BS_MULTILINE)
GUICtrlSetTip(-1, "тс - текущее состояние службы, тз - тип запуска службы")
GUICtrlCreateLabel("тс", 95, 348, 15, 15)
GUICtrlCreateLabel("тз", 95, 361, 15, 15)

GUICtrlCreateLabel("Фоновая Интел. Служба", 143, 348, 75, 30, $BS_MULTILINE)
GUICtrlCreateLabel("тз", 229, 361, 15, 15)

GUICtrlCreateLabel("Журнал Событий", 282, 348, 75, 30, $BS_MULTILINE)
GUICtrlCreateLabel("тс", 335, 348, 15, 15)
GUICtrlCreateLabel("тз", 335, 361, 15, 15)

; запуск и сбор информации о текущем состоянии служб
_ServicesStat()

$Button_StartOptim = GUICtrlCreateButton("Старт", 478, 342, 55, 35, $BS_MULTILINE)
GUICtrlSetOnEvent($Button_StartOptim, "_StartOptim")
$Button_Save = GUICtrlCreateButton("Сохранить", 400, 342, 65, 35, $BS_MULTILINE)
GUICtrlSetOnEvent($Button_Save, "_SaveOld")
GUICtrlSetState(-1, $GUI_FOCUS)
$Button_Restore = GUICtrlCreateButton("Откат", 545, 342, 55, 35, $BS_MULTILINE)
GUICtrlSetOnEvent($Button_Restore, "_RestoreOld")

GUICtrlCreateTabItem("")


GUISetState()

While 1
    Sleep(100)
WEnd



Func CLOSEClicked()
  Exit
EndFunc

;; Hotfixes Section ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; функция сохранения текущих настроек служб
Func _SaveOld()
 GUICtrlSetState($Button_Save, $GUI_DISABLE)
 Dim $aSvcState[5]=['boot','system','auto','demand','disabled']
$Save_MU   = $aSvcState[$sLog1_2]
$Save_BITS = $aSvcState[$sLog2_2]
$Save_Event= $aSvcState[$sLog3_2]

 sleep(1000)
 GUICtrlSetState($Button_Save, $GUI_ENABLE)
EndFunc

; функция оптимизации настроек служб для запуска и работы MU
Func _StartOptim()
	GUICtrlSetState($Button_StartOptim, $GUI_DISABLE)
	RunWait('sc config BITS start= demand', '', @SW_HIDE)
	RunWait('sc config wuauserv start= auto', '', @SW_HIDE)
	RunWait('sc start wuauserv', '', @SW_HIDE)
	RunWait('sc config EventLog start= auto', '', @SW_HIDE)
	RunWait('sc start EventLog', '', @SW_HIDE)
     sleep(1000)
   _ServicesStat()
   sleep(1000)
   GUICtrlSetState($Button_StartOptim, $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
;~ ; функция кнопки "Обновить"  обновление информации о текущем состоянии служб
Func _HotFixes_Update()
	 GUICtrlSetState($Button_HotFixesUpdate, $GUI_DISABLE)
     _ServicesStat()
     sleep(1000)
     GUICtrlSetState($Button_HotFixesUpdate, $GUI_ENABLE)
EndFunc
; функция сбора информации о текущем состоянии служб (используется SC и обработка полученного вывода через  StringRegExpReplace)и вывод через иконки данной информации на форму)
Func _ServicesStat()

  $sLog1_1 = ''
  $sLog1_2 = ''
  $sLog2_2 = ''
  $sLog3_1 = ''
  $sLog3_2 = ''

;  запрос информации о состоянии служб (текущее состояние: работает или нет)
 $hIPconfig1_1 = Run('sc query wuauserv', '', @SW_HIDE, $STDOUT_CHILD)
 $hIPconfig3_1 = Run('sc query eventlog', '', @SW_HIDE, $STDOUT_CHILD)
;  запрос информации о типе запуска служб (авто, вручную, отключено)
 $hIPconfig1_2 = Run('sc qc wuauserv', '', @SW_HIDE, $STDOUT_CHILD)
 $hIPconfig2_2 = Run('sc qc BITS', '', @SW_HIDE, $STDOUT_CHILD)
 $hIPconfig3_2 = Run('sc qc eventlog', '', @SW_HIDE, $STDOUT_CHILD)

 While 1
    $sLogI1_1 &= StdoutRead($hIPconfig1_1)
	$sLogI3_1 &= StdoutRead($hIPconfig3_1)

	$sLogI1_2 &= StdoutRead($hIPconfig1_2)
	$sLogI2_2 &= StdoutRead($hIPconfig2_2)
	$sLogI3_2 &= StdoutRead($hIPconfig3_2)

	 If @error Then ExitLoop
    Sleep(10)
 WEnd

; фильтрация информации о службах
  $sLog1_1 = StringRegExpReplace($sLogI1_1, "(?si).*STATE\D*(\d+).*", '\1')
  $sLog3_1 = StringRegExpReplace($sLogI3_1, "(?si).*STATE\D*(\d+).*", '\1')
  $sLog1_2 = StringRegExpReplace($sLogI1_2, "(?si).*START_TYPE\D*(\d+).*", '\1')
  $sLog2_2 = StringRegExpReplace($sLogI2_2, "(?si).*START_TYPE\D*(\d+).*", '\1')
  $sLog3_2 = StringRegExpReplace($sLogI3_2, "(?si).*START_TYPE\D*(\d+).*", '\1')
; программиорование отображение информации о службах через иконки

Dim $aIcons[2]=['error.ico','ok.ico']
$pic1_1=$aIcons[$sLog1_1=4]
$pic3_1=$aIcons[$sLog3_1=4]
$pic1_2=$aIcons[$sLog1_2=2]
$pic2_2=$aIcons[(($sLog2_2 = 3) Or ($sLog2_2 = 2))]
$pic3_2=$aIcons[$sLog1_2=2]
_ImageGet()
EndFunc

; функция отображения иконок на конкрентой вкладке формы (форма с Tab)
Func _ImageGet()
$Width = 14
$Height = 14
$hIcon1_1 = _Icons_Icon_Extract($pic1_1, -3, $Width, $Height)
$hBitmap1_1 = _Icons_Bitmap_CreateFromIcon($hIcon1_1)
$Pic1_1 = GUICtrlCreatePic('', 115, 348, $Width, $Height)
_SetHImage(-1, $hBitmap1_1)

$hIcon3_1 = _Icons_Icon_Extract($pic3_1, -3, $Width, $Height)
$hBitmap3_1 = _Icons_Bitmap_CreateFromIcon($hIcon3_1)
$Pic3_1 = GUICtrlCreatePic('', 355, 348, $Width, $Height)
_SetHImage(-1, $hBitmap3_1)

$hIcon1_2 = _Icons_Icon_Extract($pic1_2, -3, $Width, $Height)
$hBitmap1_2 = _Icons_Bitmap_CreateFromIcon($hIcon1_2)
$Pic1_2 = GUICtrlCreatePic('', 115, 361, $Width, $Height)
_SetHImage(-1, $hBitmap1_2)

$hIcon2_2 = _Icons_Icon_Extract($pic2_2, -3, $Width, $Height)
$hBitmap2_2 = _Icons_Bitmap_CreateFromIcon($hIcon2_2)
$Pic2_2 = GUICtrlCreatePic('', 249, 361, $Width, $Height)
_SetHImage(-1, $hBitmap2_2)

$hIcon3_2 = _Icons_Icon_Extract($pic3_2, -3, $Width, $Height)
$hBitmap3_2 = _Icons_Bitmap_CreateFromIcon($hIcon3_2)
$Pic3_2 = GUICtrlCreatePic('', 355, 361, $Width, $Height)
_SetHImage(-1, $hBitmap3_2)

_WinAPI_DeleteObject($hBitmap1_1)
_WinAPI_DeleteObject($hBitmap3_1)
_WinAPI_DeleteObject($hBitmap1_2)
_WinAPI_DeleteObject($hBitmap2_2)
_WinAPI_DeleteObject($hBitmap3_2)

_WinAPI_DestroyIcon($hIcon1_1)
_WinAPI_DestroyIcon($hIcon3_1)
_WinAPI_DestroyIcon($hIcon1_2)
_WinAPI_DestroyIcon($hIcon2_2)
_WinAPI_DestroyIcon($hIcon3_2)

EndFunc

;; End Hotfixes Section  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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


Отправлено: 18:04, 31-08-2010 | #17


Googler


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

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


Цитата saavaage:
поспешил отчитаться »
скобки в логических выражениях лишними не будут
Цитата saavaage:
как, все-таки, надо было написать в случае многомерного »
где-то так:
Код: Выделить весь код
Dim $aState1[3][5]=[ _
	['error.ico','error.ico','ok.ico'   ,'error.ico','error.ico'], _
	['error.ico','error.ico','error.ico','error.ico','ok.ico'   ], _
	['error.ico','error.ico','ok.ico'   ,'ok.ico'   ,'error.ico']]

$pic1_2=$aState1[0][$sLog1_2]
$pic3_2=$aState1[0][$sLog3_2]
$pic1_1=$aState1[1][$sLog1_1]
$pic3_1=$aState1[1][$sLog3_1]
$pic2_2=$aState1[2][$sLog2_2]

_ImageGet()
Это сообщение посчитали полезным следующие участники:

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


Ветеран


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

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


Вложения
Тип файла: 7z Icons&Func.7z
(35.4 Kb, 8 просмотров)

amel27, рано я радовался.
Неожиданно возникла проблема при добавлении вкладки "Devices" (в коде выделил жирным). При нажатии на кнопки "Обновить", "Старт" и "Откат" происходит "прорисовка" иконок на этой вкладке. Промучился весь день и никак не смог это разрешить. Понятно, что это происходит потому, что у меня в эти функции ( _HotFixes_Update(), _StartOptim() и _RestoreOld() ) вставлен запуск _ServicesStat() для обновления информации о службах и, соответственно, иконках. Если его (запуск) закомментировать, то все нормально, но тогда нет обновления иконок после этих операций (обновить, старт и откат).
Вот код:
читать дальше »
Код: Выделить весь код
#include <ButtonConstants.au3>
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <Icons.au3>
#include <WinAPI.au3>

Global $pic1_1, $pic3_1, $pic1_2, $pic2_2, $pic3_2, $sLogI1_1, $sLogI1_2, $sLogI2_2, $sLogI3_1, $sLogI3_2
Global $Save_Event, $Save_MU, $Save_BITS, $sLog1_2, $sLog2_2, $sLog3_2, $sLog1_1, $sLog3_1

Opt("GUIOnEventMode", 1)

$hMain_GUI = GUICreate("Диагностика и Настройка", 619, 442, 189, 122)
GUISetFont(8.5, 400, 0, 'MS Shell Dlg')
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

$Tab1 = GUICtrlCreateTab(8, 16, 601, 377)

;;;; Hotfixes ;;;;
$HotfixErrors = GUICtrlCreateTabItem("HotfixErrors")

$Button_HotFixesUpdate = GUICtrlCreateButton("Обновить", 84, 400, 60, 33, $BS_MULTILINE)
GUICtrlSetOnEvent($Button_HotFixesUpdate, "_HotFixes_Update")

; Работа со службами
GUICtrlCreateGroup("Службы, отвечающие за Автообновление", 16, 330, 370, 55)

GUICtrlCreateLabel("Автоматич. обновление", 24, 348, 75, 30, $BS_MULTILINE)
GUICtrlSetTip(-1, "тс - текущее состояние службы, тз - тип запуска службы")
GUICtrlCreateLabel("тс", 95, 348, 15, 15)
GUICtrlCreateLabel("тз", 95, 361, 15, 15)

GUICtrlCreateLabel("Фоновая Интел. Служба", 143, 348, 75, 30, $BS_MULTILINE)
GUICtrlCreateLabel("тз", 229, 361, 15, 15)

GUICtrlCreateLabel("Журнал Событий", 282, 348, 75, 30, $BS_MULTILINE)
GUICtrlCreateLabel("тс", 335, 348, 15, 15)
GUICtrlCreateLabel("тз", 335, 361, 15, 15)

; запуск и сбор информации о текущем состоянии служб
_ServicesStat()

$Button_StartOptim = GUICtrlCreateButton("Старт", 478, 342, 55, 35, $BS_MULTILINE)
GUICtrlSetOnEvent($Button_StartOptim, "_StartOptim")
$Button_Save = GUICtrlCreateButton("Сохранить", 400, 342, 65, 35, $BS_MULTILINE)
GUICtrlSetOnEvent($Button_Save, "_SaveOld")
GUICtrlSetState(-1, $GUI_FOCUS)
$Button_Restore = GUICtrlCreateButton("Откат", 545, 342, 55, 35, $BS_MULTILINE)
GUICtrlSetOnEvent($Button_Restore, "_RestoreOld")

;;; Devices ;;;
$DevicesErrors = GUICtrlCreateTabItem("DriversErrors")
GUICtrlCreateGroup("Список проблемного оборудования", 16, 48, 481, 337)

GUICtrlCreateTabItem("")

GUISetState()

While 1
    Sleep(100)
WEnd

Func CLOSEClicked()
  Exit
EndFunc

;; Hotfixes Section ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; функция сохранения текущих настроек служб
Func _SaveOld()
 GUICtrlSetState($Button_Save, $GUI_DISABLE)
 Dim $aSvcState[5]=['boot','system','auto','demand','disabled']
$Save_MU   = $aSvcState[$sLog1_2]
$Save_BITS = $aSvcState[$sLog2_2]
$Save_Event= $aSvcState[$sLog3_2]
 sleep(1000)
 GUICtrlSetState($Button_Save, $GUI_ENABLE)
EndFunc

; функция оптимизации настроек служб для запуска и работы MU
Func _StartOptim()
	GUICtrlSetState($Button_StartOptim, $GUI_DISABLE)
	RunWait('sc config BITS start= demand', '', @SW_HIDE)
	RunWait('sc config wuauserv start= auto', '', @SW_HIDE)
	RunWait('sc start wuauserv', '', @SW_HIDE)
	RunWait('sc config EventLog start= auto', '', @SW_HIDE)
	RunWait('sc start EventLog', '', @SW_HIDE)
     sleep(1000)
   _ServicesStat()
   sleep(1000)
   GUICtrlSetState($Button_StartOptim, $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
;~ ; функция кнопки "Обновить"  обновление информации о текущем состоянии служб
Func _HotFixes_Update()
	 GUICtrlSetState($Button_HotFixesUpdate, $GUI_DISABLE)
     _ServicesStat()
     sleep(1000)
     GUICtrlSetState($Button_HotFixesUpdate, $GUI_ENABLE)
EndFunc
; функция сбора информации о текущем состоянии служб (используется SC и обработка полученного вывода через  StringRegExpReplace)и вывод через иконки данной информации на форму)
Func _ServicesStat()

  $sLog1_1 = ''
  $sLog1_2 = ''
  $sLog2_2 = ''
  $sLog3_1 = ''
  $sLog3_2 = ''

;  запрос информации о состоянии служб (текущее состояние: работает или нет)
 $hIPconfig1_1 = Run('sc query wuauserv', '', @SW_HIDE, $STDOUT_CHILD)
 $hIPconfig3_1 = Run('sc query eventlog', '', @SW_HIDE, $STDOUT_CHILD)
;  запрос информации о типе запуска служб (авто, вручную, отключено)
 $hIPconfig1_2 = Run('sc qc wuauserv', '', @SW_HIDE, $STDOUT_CHILD)
 $hIPconfig2_2 = Run('sc qc BITS', '', @SW_HIDE, $STDOUT_CHILD)
 $hIPconfig3_2 = Run('sc qc eventlog', '', @SW_HIDE, $STDOUT_CHILD)

 While 1
    $sLogI1_1 &= StdoutRead($hIPconfig1_1)
	$sLogI3_1 &= StdoutRead($hIPconfig3_1)

	$sLogI1_2 &= StdoutRead($hIPconfig1_2)
	$sLogI2_2 &= StdoutRead($hIPconfig2_2)
	$sLogI3_2 &= StdoutRead($hIPconfig3_2)

	 If @error Then ExitLoop
    Sleep(10)
 WEnd

; фильтрация информации о службах
  $sLog1_1 = StringRegExpReplace($sLogI1_1, "(?si).*STATE\D*(\d+).*", '\1')
  $sLog3_1 = StringRegExpReplace($sLogI3_1, "(?si).*STATE\D*(\d+).*", '\1')
  $sLog1_2 = StringRegExpReplace($sLogI1_2, "(?si).*START_TYPE\D*(\d+).*", '\1')
  $sLog2_2 = StringRegExpReplace($sLogI2_2, "(?si).*START_TYPE\D*(\d+).*", '\1')
  $sLog3_2 = StringRegExpReplace($sLogI3_2, "(?si).*START_TYPE\D*(\d+).*", '\1')
; программиорование отображение информации о службах через иконки

Dim $aIcons[2]=['error.ico','ok.ico']
$pic1_1=$aIcons[$sLog1_1=4]
$pic3_1=$aIcons[$sLog3_1=4]
$pic1_2=$aIcons[$sLog1_2=2]
$pic2_2=$aIcons[(($sLog2_2 = 3) Or ($sLog2_2 = 2))]
$pic3_2=$aIcons[$sLog1_2=2]
_ImageGet()
EndFunc

; функция отображения иконок на конкрентой вкладке формы (форма с Tab)
Func _ImageGet()
$Width = 14
$Height = 14
$hIcon1_1 = _Icons_Icon_Extract($pic1_1, -3, $Width, $Height)
$hBitmap1_1 = _Icons_Bitmap_CreateFromIcon($hIcon1_1)
$Pic1_1 = GUICtrlCreatePic('', 115, 348, $Width, $Height)
_SetHImage(-1, $hBitmap1_1)

$hIcon3_1 = _Icons_Icon_Extract($pic3_1, -3, $Width, $Height)
$hBitmap3_1 = _Icons_Bitmap_CreateFromIcon($hIcon3_1)
$Pic3_1 = GUICtrlCreatePic('', 355, 348, $Width, $Height)
_SetHImage(-1, $hBitmap3_1)

$hIcon1_2 = _Icons_Icon_Extract($pic1_2, -3, $Width, $Height)
$hBitmap1_2 = _Icons_Bitmap_CreateFromIcon($hIcon1_2)
$Pic1_2 = GUICtrlCreatePic('', 115, 361, $Width, $Height)
_SetHImage(-1, $hBitmap1_2)

$hIcon2_2 = _Icons_Icon_Extract($pic2_2, -3, $Width, $Height)
$hBitmap2_2 = _Icons_Bitmap_CreateFromIcon($hIcon2_2)
$Pic2_2 = GUICtrlCreatePic('', 249, 361, $Width, $Height)
_SetHImage(-1, $hBitmap2_2)

$hIcon3_2 = _Icons_Icon_Extract($pic3_2, -3, $Width, $Height)
$hBitmap3_2 = _Icons_Bitmap_CreateFromIcon($hIcon3_2)
$Pic3_2 = GUICtrlCreatePic('', 355, 361, $Width, $Height)
_SetHImage(-1, $hBitmap3_2)

_WinAPI_DeleteObject($hBitmap1_1)
_WinAPI_DeleteObject($hBitmap3_1)
_WinAPI_DeleteObject($hBitmap1_2)
_WinAPI_DeleteObject($hBitmap2_2)
_WinAPI_DeleteObject($hBitmap3_2)

_WinAPI_DestroyIcon($hIcon1_1)
_WinAPI_DestroyIcon($hIcon3_1)
_WinAPI_DestroyIcon($hIcon1_2)
_WinAPI_DestroyIcon($hIcon2_2)
_WinAPI_DestroyIcon($hIcon3_2)

EndFunc


Буду признателен за любую подсказку...

PS на всякий случай, прикрепил архив с иконками и Icons.au3 (без них скрипт не сработает!)

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


Последний раз редактировалось saavaage, 02-09-2010 в 14:16.


Отправлено: 00:05, 02-09-2010 | #19


Ветеран


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

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


Решение предложено Yashied на русском форуме http://autoit-script.ru/index.php/to....html#msg18794

Вот адаптированный под мой скрипт код:

читать дальше »
Код: Выделить весь код
#include <ButtonConstants.au3>
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <Icons.au3>
#include <WinAPI.au3>

Global $Pic1_1, $Pic3_1, $Pic1_2, $Pic2_2, $Pic3_2, $PicError, $sLogI1_1, $sLogI1_2, $sLogI2_2, $sLogI3_1, $sLogI3_2, $hIcon, $Width = 14, $Height = 14
Global $Save_Event, $Save_MU, $Save_BITS, $sLog1_2, $sLog2_2, $sLog3_2, $sLog1_1, $sLog3_1

Global $aIcons[2] = ['error.ico', 'ok.ico']

For $i = 0 To 1
    $hIcon = _Icons_Icon_Extract($aIcons[$i], 0, $Width, $Height)
	$aIcons[$i] = _Icons_Bitmap_CreateFromIcon($hIcon)
	_WinAPI_DestroyIcon($hIcon)
Next

Opt("GUIOnEventMode", 1)

$hMain_GUI = GUICreate("Диагностика и Настройка", 619, 442, 189, 122)
GUISetFont(8.5, 400, 0, 'MS Shell Dlg')
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

$Tab1 = GUICtrlCreateTab(8, 16, 601, 377)

;;;; Hotfixes ;;;;
$HotfixErrors = GUICtrlCreateTabItem("HotfixErrors")

$Button_HotFixesUpdate = GUICtrlCreateButton("Обновить", 84, 400, 60, 33, $BS_MULTILINE)
GUICtrlSetOnEvent($Button_HotFixesUpdate, "_HotFixes_Update")

; Работа со службами
GUICtrlCreateGroup("Службы, отвечающие за Автообновление", 16, 330, 370, 55)

GUICtrlCreateLabel("Автоматич. обновление", 24, 348, 75, 30, $BS_MULTILINE)
GUICtrlSetTip(-1, "тс - текущее состояние службы, тз - тип запуска службы")
GUICtrlCreateLabel("тс", 95, 348, 15, 15)
GUICtrlCreateLabel("тз", 95, 361, 15, 15)

GUICtrlCreateLabel("Фоновая Интел. Служба", 143, 348, 75, 30, $BS_MULTILINE)
GUICtrlCreateLabel("тз", 229, 361, 15, 15)

GUICtrlCreateLabel("Журнал Событий", 282, 348, 75, 30, $BS_MULTILINE)
GUICtrlCreateLabel("тс", 335, 348, 15, 15)
GUICtrlCreateLabel("тз", 335, 361, 15, 15)


$Pic1_1 = GUICtrlCreatePic('', 115, 348, $Width, $Height)
$Pic3_1 = GUICtrlCreatePic('', 355, 348, $Width, $Height)
$Pic1_2 = GUICtrlCreatePic('', 115, 361, $Width, $Height)
$Pic2_2 = GUICtrlCreatePic('', 249, 361, $Width, $Height)
$Pic3_2 = GUICtrlCreatePic('', 355, 361, $Width, $Height)
; запуск и сбор информации о текущем состоянии служб
_ServicesStat()

$Button_StartOptim = GUICtrlCreateButton("Старт", 478, 342, 55, 35, $BS_MULTILINE)
GUICtrlSetOnEvent($Button_StartOptim, "_StartOptim")
$Button_Save = GUICtrlCreateButton("Сохранить", 400, 342, 65, 35, $BS_MULTILINE)
GUICtrlSetOnEvent($Button_Save, "_SaveOld")
GUICtrlSetState(-1, $GUI_FOCUS)
$Button_Restore = GUICtrlCreateButton("Откат", 545, 342, 55, 35, $BS_MULTILINE)
GUICtrlSetOnEvent($Button_Restore, "_RestoreOld")

;;; Devices ;;;
$DevicesErrors = GUICtrlCreateTabItem("DriversErrors")
GUICtrlCreateGroup("Список проблемного оборудования", 16, 48, 481, 337)

GUICtrlCreateTabItem("")

GUISetState()

While 1
    Sleep(100)
WEnd

Func CLOSEClicked()
  Exit
EndFunc

;; Hotfixes Section ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; функция сохранения текущих настроек служб
Func _SaveOld()
 GUICtrlSetState($Button_Save, $GUI_DISABLE)
 Dim $aSvcState[5]=['boot','system','auto','demand','disabled']
$Save_MU   = $aSvcState[$sLog1_2]
$Save_BITS = $aSvcState[$sLog2_2]
$Save_Event= $aSvcState[$sLog3_2]
 sleep(1000)
 GUICtrlSetState($Button_Save, $GUI_ENABLE)
EndFunc

; функция оптимизации настроек служб для запуска и работы MU
Func _StartOptim()
	GUICtrlSetState($Button_StartOptim, $GUI_DISABLE)
	RunWait('sc config BITS start= demand', '', @SW_HIDE)
	RunWait('sc config wuauserv start= auto', '', @SW_HIDE)
	RunWait('sc start wuauserv', '', @SW_HIDE)
	RunWait('sc config EventLog start= auto', '', @SW_HIDE)
	RunWait('sc start EventLog', '', @SW_HIDE)
     sleep(1000)
   _ServicesStat()
   sleep(1000)
   GUICtrlSetState($Button_StartOptim, $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

; функция кнопки "Обновить"  обновление информации о текущем состоянии служб
Func _HotFixes_Update()
	 GUICtrlSetState($Button_HotFixesUpdate, $GUI_DISABLE)
     _ServicesStat()
     sleep(1000)
     GUICtrlSetState($Button_HotFixesUpdate, $GUI_ENABLE)
 EndFunc

; функция сбора информации о текущем состоянии служб (используется SC и обработка полученного вывода через  StringRegExpReplace)и вывод через иконки данной информации на форму)
Func _ServicesStat()

  $sLog1_1 = ''
  $sLog1_2 = ''
  $sLog2_2 = ''
  $sLog3_1 = ''
  $sLog3_2 = ''

;  запрос информации о состоянии служб (текущее состояние: работает или нет)
 $hIPconfig1_1 = Run('sc query wuauserv', '', @SW_HIDE, $STDOUT_CHILD)
 $hIPconfig3_1 = Run('sc query eventlog', '', @SW_HIDE, $STDOUT_CHILD)
;  запрос информации о типе запуска служб (авто, вручную, отключено)
 $hIPconfig1_2 = Run('sc qc wuauserv', '', @SW_HIDE, $STDOUT_CHILD)
 $hIPconfig2_2 = Run('sc qc BITS', '', @SW_HIDE, $STDOUT_CHILD)
 $hIPconfig3_2 = Run('sc qc eventlog', '', @SW_HIDE, $STDOUT_CHILD)

 While 1
    $sLogI1_1 &= StdoutRead($hIPconfig1_1)
	$sLogI3_1 &= StdoutRead($hIPconfig3_1)

	$sLogI1_2 &= StdoutRead($hIPconfig1_2)
	$sLogI2_2 &= StdoutRead($hIPconfig2_2)
	$sLogI3_2 &= StdoutRead($hIPconfig3_2)

	 If @error Then ExitLoop
    Sleep(10)
 WEnd

; фильтрация информации о службах
  $sLog1_1 = StringRegExpReplace($sLogI1_1, "(?si).*STATE\D*(\d+).*", '\1')
  $sLog3_1 = StringRegExpReplace($sLogI3_1, "(?si).*STATE\D*(\d+).*", '\1')
  $sLog1_2 = StringRegExpReplace($sLogI1_2, "(?si).*START_TYPE\D*(\d+).*", '\1')
  $sLog2_2 = StringRegExpReplace($sLogI2_2, "(?si).*START_TYPE\D*(\d+).*", '\1')
  $sLog3_2 = StringRegExpReplace($sLogI3_2, "(?si).*START_TYPE\D*(\d+).*", '\1')
; программиорование отображение информации о службах через иконки

_SetHImage($Pic1_1, $aIcons[$sLog1_1 = 4])
_SetHImage($Pic3_1, $aIcons[$sLog3_1=4])
_SetHImage($Pic1_2, $aIcons[$sLog1_2=2])
_SetHImage($Pic2_2, $aIcons[(($sLog2_2 = 3) Or ($sLog2_2 = 2))])
_SetHImage($Pic3_2, $aIcons[$sLog3_2=2])
_SetHImage($PicError, $aIcons[$sLog3_1=4])

EndFunc


Т.о. тема решена. Еще раз спасибо за помощь amel27 и Yashied.

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


Отправлено: 12:26, 04-09-2010 | #20



Компьютерный форум 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




 
Переход