Войти

Показать полную графическую версию : [архив - Часть 2] AutoIt скрипты


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 [32] 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

NikLok
23-10-2007, 10:01
Creat0R, amel27, мНЕ собственно нужен как основа скрипт взятия имен машин типа списка аналогичного "Сетевеое окружение". При этом акцент было бы интересно установить на взятие его на машинах с несколькими сетевыми интерфейсами!

amel27
23-10-2007, 11:32
NikLok
Перед тем как писать скрипт нужно определиться как разрешать имена: широковещанием (NetBIOS), сервер WINS или DNS?.. Это определяется настройками локальной сети.

TERMINAL
23-10-2007, 12:01
У меня идёт опрос окон:
For $i = 0 To 25
MsgBox(64,"System disc","Идёт установка программы ! Подождите пожалуйста "& 26-$i &" секунд...", 2)
if WinWait("Окно 1","", 1) Then
ControlClick("Окно 1","","Button2")
EndIf
If WinWait("Окно 2","",1) Then
ControlClick("Окно 2","","Button2")
EndIf
If WinWait("Окно 3","", 1) Then
ControlClick("Окно 3","","Button2")
EndIf
If WinWait("Окно 4","", 1) Then
ControlClick("Окно 4","","Button2")
EndIf
Next

Дальше идёт продолжение выполнения скрипта....

Возможно ли сделать в цикле так, что если какое-то из окон определяется то заканчивает работать цикл и переходит к дальнейшему выполнению скрипта?

Maza Faka
23-10-2007, 12:15
TERMINAL
если какое-то из окон определяется то заканчивает работать цикл

ExitLoop

NikLok
23-10-2007, 15:06
amel27, Конечно лучше универсальный вариант. Но на худой конец и простой NetBios сгодится!

amel27
24-10-2007, 11:55
на худой конец и простой NetBios сгодится »
1. "NET VIEW" ;)
2. То же через API (функция возвращает массив):Global Const $SV_TYPE_WORKSTATION = 0x1
Global Const $SV_TYPE_SERVER = 0x2
Global Const $SV_TYPE_SQLSERVER = 0x4
Global Const $SV_TYPE_DOMAIN_CTRL = 0x8
Global Const $SV_TYPE_DOMAIN_BAKCTRL = 0x10
Global Const $SV_TYPE_TIME_SOURCE = 0x20
Global Const $SV_TYPE_AFP = 0x40
Global Const $SV_TYPE_NOVELL = 0x80
Global Const $SV_TYPE_DOMAIN_MEMBER = 0x100
Global Const $SV_TYPE_PRINTQ_SERVER = 0x200
Global Const $SV_TYPE_DIALIN_SERVER = 0x400
Global Const $SV_TYPE_XENIX_SERVER = 0x800
Global Const $SV_TYPE_NT = 0x1000
Global Const $SV_TYPE_WFW = 0x2000
Global Const $SV_TYPE_SERVER_MFPN = 0x4000
Global Const $SV_TYPE_SERVER_NT = 0x8000
Global Const $SV_TYPE_POTENTIAL_BROWSER = 0x10000
Global Const $SV_TYPE_BACKUP_BROWSER = 0x20000
Global Const $SV_TYPE_MASTER_BROWSER = 0x40000
Global Const $SV_TYPE_DOMAIN_MASTER = 0x80000
Global Const $SV_TYPE_WINDOWS = 0x400000
Global Const $SV_TYPE_CLUSTER_NT = 0x1000000
Global Const $SV_TYPE_TERMINALSERVER = 0x2000000
Global Const $SV_TYPE_CLUSTER_VS_NT = 0x4000000
Global Const $SV_TYPE_LOCAL_LIST_ONLY = 0x40000000
Global Const $SV_TYPE_DOMAIN_ENUM = 0x80000000
Global Const $SV_TYPE_ALL = 0xFFFFFFFF

Func _NetServerEnum ($iSrvType = -1, $sDomain = '')
Local $uBufPtr = DllStructCreate("ptr;int;int"), $res[1]=[0], $i
Local $uRecord = DllStructCreate("dword;ptr"), $iRecLen = DllStructGetSize($uRecord)
Local $uString = DllStructCreate("char[16]")
Local $uDomain = DllStructCreate("byte[32]"), $pDomain = 0
If Not ($sDomain='' Or $sDomain='*') Then
DllStructSetData($uDomain, 1, StringToBinary($sDomain,2))
$pDomain = DllStructGetPtr($uDomain)
EndIf
Local $ret = DllCall ("netapi32.dll", "int", "NetServerEnum", _
"ptr", 0, "int", 100, _
"ptr", DllStructGetPtr($uBufPtr,1), "int", -1, _
"ptr", DllStructGetPtr($uBufPtr,2), _
"ptr", DllStructGetPtr($uBufPtr,3), _
"int", $iSrvType, "ptr", $pDomain, "int", 0 )
If $ret[0] Then Return SetError(1, $ret[0], '')
Local $res[DllStructGetData($uBufPtr,3)+1]=[DllStructGetData($uBufPtr,3)]
For $i=1 To DllStructGetData($uBufPtr,3)
Local $uRecord = DllStructCreate("dword;ptr", DllStructGetData($uBufPtr,1)+($i-1)*$iRecLen)
Local $sNBName = DllStructCreate("byte[32]", DllStructGetData($uRecord,2))
DllStructSetData($uString,1,BinaryToString(DllStructGetData($sNBName,1),2))
$res[$i] = DllStructGetData($uString,1)
Next
$ret = DllCall ("netapi32.dll", "int", "NetApiBufferFree", "ptr", DllStructGetData($uBufPtr,1))
Return $res
EndFunc

NikLok
24-10-2007, 12:20
amel27, Спасибо! Буду изучать, но пока не понял как указать конкретную сеть для просмотра?! У меня 4 карточки стоит!
Во блин ты даешь! И ведь работает! Я так понимаю параметр ей давть бессмысленно, или там при объявлении он задан на случай отсутствия?

Maza Faka
24-10-2007, 16:57
Как создать 24 размерный массив со случайным числом от 1 до 13, причём числа должны быть парными, то есть у каждого числа должна быть пара и расположение их в массиве всегда должно быть случайным.

Creat0R
24-10-2007, 21:30
Maza Faka,
Как создать 24 размерный массив со случайным числом от 1 до 13, причём числа должны быть парными
Возможно 24 элементный, не размерный? т.е двумерный, но содержащий 24 элемента?

Вобщем если я правильно понял, то вот:

#include <Array.au3>

Dim $Array[25][2]

For $i = 1 To 24
$iRandom = Random(1, 13, 1)
$Array[$i][0] = $iRandom
Do
$jRand = Random(1, 24, 1)
Until $Array[$jRand][1] = ""
$Array[$jRand][1] = $iRandom
Next

_ArrayDisplay($Array)

amel27
25-10-2007, 05:45
NikLok
не понял как указать конкретную сеть для просмотра?! У меня 4 карточки стоит! »В NetBIOS нельзя ограничить широковещание одной карточкой... Если все подсети (карточки) находятся в одном широковещательном домене или если именование настроено через WINS, то ограничение не имеет смысла. Если же подсети имеют свои системы именования, то во-первых, "многокарточный" комп не должен быть мастер-браузером (подробно: KB191611 (http://support.microsoft.com/kb/191611)). Во-вторых, можно попытаться отобрать компы явно задав имя домена/группы (скрипт подправил), список всех доменов/групп можно получить передав 1-м параметром $SV_TYPE_DOMAIN_ENUM.

Я так понимаю параметр ей давть бессмысленно, или там при объявлении он задан на случай отсутствия? »На случай отсутствия ($SV_TYPE_ALL). Вот кстати еще вариант через ADSI:Func _GetDomainComputers($sDomain)
Local $objComp, $res[1]=[0], $aType[1] = ["computer"]
Local $objDom = ObjGet('WinNT://'& $sDomain)
If $objDom=0 Then Return SetError(1)
$objDom.Filter = $aType
For $objComp In $objDom
$res[0]+=1
ReDim $res[$res[0]+1]
$res[$res[0]]=$objComp.Name
Next
Return $res
EndFunc

NikLok
25-10-2007, 10:08
amel27, В NetBIOS нельзя ограничить широковещание одной карточкой. »
Насколько я знаю посылка широковещательного запроса посылка по полной маске последнего октета?.
Имею разные сетевые адреса на всех 4-х картах. Ну для примера пусть две карты имеют адреса 192.168.0.10 и 162.16.10.24.
WINS адресов в настройке карточек нет. Домены не используются пока!
Как мне узнать какой комп по какой сети я вижу.
Вообще нужно узнать какие станции имеют подключение к нескольким сегментам сразу.
Что можешь порекомендовать почитать по данной тематике.

Creat0R
25-10-2007, 11:34
Как можно перечитать содержимое папки в меню, но при этом поместив каталоги (подменю) в самый верх, а не как попало (по дате вроде бы сортируются)... а также требуется вернуть двумерный массив с контролями от создания пунктов меню (только пунктов, подменю не нужны), и с путями по порядку (пути только файлов, чтобы позже при нажатии на пункт файл можно было запустить)?

Вот рабочий пример для считывания установочной папки аутоита, но подменю не в начале (они присутствуют в той позиции, где были найдены в процессе поиска), а мне нужно именно в начале:

#include <GuiConstants.au3>
Opt("GuiOnEventMode", 1)

$Gui = GuiCreate("Test")
GUISetOnEvent(-3, "Quit")

$Menu = GUICtrlCreateMenu("AutoIt")
$AutoItPath = StringRegExpReplace(@AutoItExe, '\\[^\\]+$', '')
Global $Elements = GetFolderToMenu($AutoItPath, $Menu)

GUISetState()

While 1
Sleep(100)
WEnd

Func GetFolderToMenu($sPath, $hMenu)
Local $RetArray[1][4], $SubDirsArr, $hSubMenu, $FindNextFile, $CurrentPath, $iUbound
$sPath = StringRegExpReplace($sPath, '\\+$', '')

Local $FindFirstFile = FileFindFirstFile($sPath & '\*.*')
If @error = 1 Then Return SetError(1, 0, -1)

While 1
$FindNextFile = FileFindNextFile($FindFirstFile)
If @error = 1 Then ExitLoop
$CurrentPath = $sPath & "\" & $FindNextFile
If StringInStr(FileGetAttrib($CurrentPath), 'D') And $FindNextFile <> "Include" And $FindNextFile <> "Examples" Then
$hSubMenu = GUICtrlCreateMenu($FindNextFile, $hMenu)
$SubDirsArr = GetFolderToMenu($CurrentPath, $hSubMenu)
If IsArray($SubDirsArr) Then
For $i = 1 To UBound($SubDirsArr)-1
If StringInStr(FileGetAttrib($SubDirsArr[$i][3]), 'D') Then
GUICtrlCreateMenu($SubDirsArr[$i][2], $SubDirsArr[$i][0])
Else
$iUbound = UBound($RetArray)
ReDim $RetArray[$iUbound+1][4]
$RetArray[$iUbound][1] = $SubDirsArr[$i][1]
$RetArray[$iUbound][2] = $SubDirsArr[$i][2]
$RetArray[$iUbound][3] = $SubDirsArr[$i][3]
EndIf
Next
EndIf
ElseIf Not StringInStr(FileGetAttrib($CurrentPath), 'D') Then
$iUbound = UBound($RetArray)
ReDim $RetArray[$iUbound+1][4]
$RetArray[$iUbound][0] = $hMenu
$RetArray[$iUbound][1] = GUICtrlCreateMenuItem($FindNextFile, $hMenu)
$RetArray[$iUbound][2] = $FindNextFile
$RetArray[$iUbound][3] = $CurrentPath
GUICtrlSetOnEvent(-1, "MenuItemEvents")
EndIf
WEnd
FileClose($FindFirstFile)
$RetArray[0][0] = UBound($RetArray)-1
Return $RetArray
EndFunc

Func MenuItemEvents()
For $i = 1 To $Elements[0][0]
If $Elements[$i][1] = @GUI_CtrlId Then
ShellExecute($Elements[$i][3])
ExitLoop
EndIf
Next
EndFunc

Func Quit()
Exit
EndFunc

Я пытался создавать сначала каталоги (подменю), а потом проходить полученный массив и создавать файлы, но у меня не получилось на первом этапе (создание каталогов) записать все пути чтобы потом по ним проходится в том же порядке и создавать соответственно пункты :( .

Creat0R
26-10-2007, 03:22
:yahoo: - Получилось! см. скриншот:

http://img507.imageshack.us/img507/3450/autoitdinamycmenuaa1.th.png (http://img507.imageshack.us/my.php?image=autoitdinamycmenuaa1.png)

Сам скрипт + библиотеку ModernMenu.au3 прикладываю вместе с постом (разукрашенного кода боее 22 тысяч строк!, а прикладывать библиотеку всё ровно нужно (не помню где брал, а искать лень :tongue: ), так что пусть будут вместе в архиве ;) ).

amel27
26-10-2007, 08:03
Creat0R
интересно, а ограничения на размер меню какие?.. а то я натравил твой скрипт в корень диска C:\ и он мне выдал: ModernMenu.au3 (450) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.: :jester:

NikLok
Насколько я знаю посылка широковещательного запроса посылка по полной маске последнего октета »тут видимо только во все сети, так как "тип узла" NetBIOS задается для хоста, а не карточки
Имею разные сетевые адреса на всех 4-х картах [...]
WINS адресов в настройке карточек нет. Домены не используются пока! »ну, домен необязателен.... можно для каждой подсети определить свою группу, по которой затем и выбирать компы, хотя для многокарточных придется ограничиться только какой-то одной группой
Как мне узнать какой комп по какой сети я вижу.
Вообще нужно узнать какие станции имеют подключение к нескольким сегментам сразу. »варианты:
- по имени (удаленно) через WMI "снять" конфигурацию сетевых интерфейсов;
- поднять WINS-сервер и брать с него занимаемые именем IP-адреса.
Что можешь порекомендовать почитать по данной тематике. »
для начала можно ТУТ (http://phys.kemsu.ru/pub/folders/To%20look!(863)/Text1.html#Оглавление) (главы 8, 9)

Creat0R
26-10-2007, 08:28
amel27,
интересно, а ограничения на размер меню какие?
1000 (явно массив не возврастает, обьявлен на 1000), библиотека не моя :tongue: , я сам только заметил, вот поправлены вариант, а также в примере исправлена ошибка с файлами ярлыков + меню Quick Launch + изменён фон меню (для увеличения скорости) + ещё несколько доработок ;)

P.S
Библиотека переименована в Menu_With_Icons_Incl.au3 (её содержание также намного изменилось).

Davlet
26-10-2007, 10:34
Подскажите можно ли при заблокированной системе (win XP) симулировать клавиатурные нажатия?
При не заблокированной все нормально отрабатывается, а при заблокированной никак не хочет.
Вы уж прости если ламерский вопрос, но я только вчера сел знакомиться с AutoIt.
Вот сам код.

WinWait("Генератор отчетов ")
WinActive("Генератор отчетов")
If @error=1 Then WinActivate("Генератор отчетов")
;Выбираем отчет
Send("{DOWN}")
Sleep(300)
Send("{DOWN}")
Sleep(300)
Send("{DOWN}")
Sleep(300)
Send("{RIGHT}")
Sleep(300)
Send("{DOWN}")
Sleep(300)
Send("{DOWN}")
Sleep(300)
Send("{DOWN}")
Sleep(300)
Send("{DOWN}")
Sleep(300)
Send("{DOWN}")
Sleep(300)
;Открыли отчет
Send("{ENTER}")


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

А эти строчки по идее проверяют активно ли окно и если нет делают его активным :) Ну это по моим соображениям из того что я подчерпнул в справке.
WinActive("Генератор отчетов")
If @error=1 Then WinActivate("Генератор отчетов")

Сделано потому что при заблокированной системе
WinWaitActive("Генератор отчетов")
можно ждать до бесконечности.

По другому отчет выбрать не получается т.к. выбор идет из дерева (class TTreeView), а как я понял AutoIt не может сним работать.
Подскажите как можно это сделать?

Creat0R
26-10-2007, 11:02
Davlet,
можно ли при заблокированной системе (win XP) симулировать клавиатурные нажатия?
Из примера в справке исходит что вроде можно:

If @OSVersion <> "WIN_98" And @OSVersion <> "WIN_ME" Then
BlockInput(1)
EndIf

Run("notepad")
WinWaitActive("Untitled - Notepad")
Send("{F5}") ;pastes time and date

BlockInput(0)

AutoIt не может сним работать
Ну почему, если нужно получить текст, то есть способы (а значит и кликнуть по определённому элементу полагаю тоже можно)...

Вот пример (должна быть установлена библиотека отсюда (http://www.autoitscript.com/forum/index.php?automodule=downloads&req=download&code=confirm_download&id=47), если есть проблемы с установкой, решение есть тут (http://forum.ru-board.com/topic.cgi?forum=5&topic=17705&start=500#12)) - Открывает “Диспетчер устройств”, переходит к 16-тому пункту, раскрывает его, и возвращает текст раскрытого подпункта:


#include <A3LTreeView.au3>

ShellExecute("devmgmt.msc")
WinWait("[CLASS:MMCMainFrame]")

$hWnd = WinGetHandle("[CLASS:MMCMainFrame]")
$h_Item = ControlGetHandle($hWnd, "", "SysTreeView321")

ControlSend($hWnd, "", "SysTreeView321", "{Down 16} {Right 2}")
ControlFocus($hWnd, "", "SysTreeView321")

$GetText = _TreeView_GetText($h_Item, _TreeView_GetSelection($h_Item))

MsgBox(0, "", $GetText)

ControlFocus($hWnd, "", "SysTreeView321")
Sleep(1500)
WinClose($hWnd)

Davlet
26-10-2007, 11:18
Creat0R

Получилось используя

ControlSend("Генератор отчетов", "", "[CLASS:TTreeView; INSTANCE:5]", "{DOWN}")

и т.д.

Но сейчас посмотрю (обмозгую :) ) что ты предложил.




If @OSVersion <> "WIN_98" And @OSVersion <> "WIN_ME" Then
BlockInput(1)
EndIf

Run("notepad")
WinWaitActive("Untitled - Notepad")
Send("{F5}") ;pastes time and date

BlockInput(0)


Не получилось, таже ситуации.

буду делать через ControlSend.

mikola1983
26-10-2007, 14:23
Доброго времени суток уважаемые ..очень нужна ваша помошь. нужно установить лицензионное ПО на более сотни машин соответствено на каждое свой ключ. есть предположение что с помошью автоита можно работать с файлом где построчно будут ключи ...напишите пожалуйста как взять из текстового или экселевского файла строку и передать ее в программу....?

Maza Faka
26-10-2007, 17:11
mikola1983
Скажем у каждого компьютер имеется имя, например WS1; WS2 и т.д., также имеется текстовый файл с ключами, где номер каждой строки, соответствует номеру машины, соответственно можно написать такой скрипт:

$number = StringRegExpReplace(@ComputerName, "[a-zA-z]", "") ; Получаем номер машины
$list = "c:\list.txt" ;Переменная с текстовым файлом, в котором находятся лицензии
$string = FileReadLine($list, $number) ;Считываем строку соответствующую номеру компьютера и присваиваем переменной
MsgBox(0, "", $string) ;Это просто просмотр строки
;Здесь твой код...

Просто переделай под свою задачу ;)




© OSzone.net 2001-2012