Показать полную графическую версию : [архив - Часть 2] AutoIt скрипты
Diamond
Кто ни будь знает, как использовать команду PluginOpen() и где взять сами плагины?
Как я понял, это может быть использованно вместо DllOpen(), но предназначено для открытия плагинов SDK...
Вот ссылка на топик в оф. форуме - Coming Soon: Plugins (http://www.autoitscript.com/forum/index.php?showtopic=15279)
А вот как я понял сами плагины - http://www.autoitscript.com/autoit3/files/beta/plugin_sdk/au3_plugin_sdk.zip
И ссылка на помощь по коммандам (во встроенной справке описании почему то нет :( ) - http://www.autoitscript.com/autoit3/files/beta/autoit/undocumented/PluginOpen.htm
Такой вопрос касательно RegExp...
К примеру имеем такую переменную:
$String = "This is the text"
И нужно используя StringRegExpReplace() заменить все двоичные пробелы на одиночные, т.е чтобы в результате получилось это:
$String = "This is the text"
Это можно сделать циклом:
While StringInStr($String, ' ')
$String = StringReplace($String, ' ', ' ')
WEnd
Но полагаю RegExp быстрее справится с этой задачей....
P.S
Желательно организовать для этого функцию, т.к вызывать придётся не раз, и использовать разные удвоенные символы...
Вот пример этой же функции используя цикл (до сих пор ею и пользуюсь) :
Func ReplaceUnsupported($String, $Patern='[*?\\/|:<>"]', $Replace="_")
If StringLen($String) = 0 Then Return $String
$String = StringRegExpReplace($String, $Patern, $Replace)
While StringInStr($String, $Replace & $Replace) <> 0
$String = StringReplace($String, $Replace & $Replace, $Replace)
WEnd
Return $String
EndFunc
В общем в целом, эта функция предназначена для замены не поддерживаемых символов в имени файла, но чтобы заменяемы символы не повторялись подряд.
Нашёл!!! Эврика!!! :yahoo:
Вот оно - StringRegExpReplace($String, '( +)', ' ')
И вот функция соответственно (для других символов) :
Func ReplaceUnsupported($String, $Patern='[*?\\/|:<>"]', $Replace="_")
If StringLen($String) = 0 Then Return $String
$String = StringRegExpReplace($String, $Patern, $Replace)
$String = StringRegExpReplace($String, '(' & $Replace & '+)', $Replace)
Return $String
EndFunc
Вот пример для использования с именами файлов (чтобы в имени файла не попались неподдерживаемые символы, и чтобы при их замене не было повторных замененных символов) :
$String = 'This//\\is<|"|>my??"??:??\*\"::|/::"File.txt'
$String = ReplaceUnsupported($String, '[*?\\/|:<>"]', '_')
ConsoleWrite($String) ;На выходе имеем это - This_is_my_File.txt
schel4ok
25-06-2007, 18:04
amel27
попробуй вместо Run() использовать ShellExecute() не для EXE, а для ярлыка (*.LNK), поищи его в папке Рабочего стола....
Попробовал - не выходит. То есть ярлык в принципе запускается и начинается процесс настройки Маткада. Но в самом конце, он пишет что задан неправильный параметр ярлыка.
schel4ok
26-06-2007, 14:05
Недавно пробовал запустить msi файл из под АвтоИТ (TweakUI.msi) и вот что вышло:
- если запускать ShellExecute("файл.msi /параметр") то ничего не получается
- если запускать ShellExecute("файл.msi") все нормально запускается,но...
при появлении первого же диалогового окна установщика, я скопировал его титул и текст через Ау3инфо и попытался запустить скрипт.
оказалось что АвтоИТ почему то не понимает этих данных и соответственно скрипт останавливается на WinWaitActive
why?
schel4ok
оказалось что АвтоИТ почему то не понимает этих данных и соответственно скрипт останавливается на WinWaitActive
Возможно окно не становится активным?
Попробуй вместо WinWaitActive() использовать WinWait().
schel4ok
27-06-2007, 10:13
Creat0R
Возможно окно не становится активным?
Попробуй вместо WinWaitActive() использовать WinWait().
Возможно, попробую на днях.
Но когда я испытывал скрипт - я вручную запускал инсталлер.
Потом запускал строчки скрипта, отвечающие за обработку данного окна WinWaitActive.
И после этого тыкал мышкой по окну - соответственно оно по любому было активным, но скрипт не работал.
Вообще я часто встречал что когда наводишь на один и тот же элемент управления, то в окне Ау3инфо в строке classnameNN мигают разные значения.
Я так один раз, например, устанавливал прогу и не мог понять почему она не ставиться. А дело было в том, что в четвертое по счету окно я вводил в текстовое поле путь к папке ярлыков в меню пуск inet\swissknife, а этот путь вместо этого попадал в текстовое поле во втором окне выбора пути к установочной папке C:\swissknife.
Так что shit happens! И видимо дело в наложении одних и тех же элементов управления и в их видимости и невидимости в определенные моменты.
schel4ok
27-06-2007, 13:15
Кстати, а существуют ли подобные АвтоИт программы для КПК?
тоже интересует версия для КПК.
ну и вопрос естественно!
на сервере лежит файл txt формата который каждый день обновляется, меняются url к exe файлу который нужно скачать и запустить нашим скриптом,
можно ли создать скрипт который будет выполнять работу парсера, а точней выдерать с файла http://www.site.com/update.txt строку(http://url_to_file_from_txt_file.com/filename.exe) одна единственая строка в файле! затем качать этот самый exe и запустить его в тихом режиме..
Global $file = 'file.exe'
$Ret = InetGet("http://url_to_file_from_txt_file.com/filename.exe", $file, 1, 0)
If $Ret = 1 Then RunWait ( $file & ' /S' )
ярлык в принципе запускается и начинается процесс настройки Маткада. Но в самом конце, он пишет что задан неправильный параметр ярлыкакак последняя альтернатива - произвести двойной клик на ярлыке, но для этого нужно знать его координаты на рабочем столе... пошарившись по офсайту почему-то не нашел готового решения (может плохо искал? :idontnow: ), поэтому пришлось сваять самому:#include <ListViewConstants.au3>
$a = _GetDesktopItemList('Мой компьютер')
;~ свернуть все окна
Send("#d")
;~ запустить ярлык
MouseClick ("left", $a[0], $a[1], 2, 1)
;~ По имени элемента рабочего стола (ярлыка) возвращает его местоположение:
;~ x-координата, y-координата.
;~ Если не задан конкретный элемент, то возвращает двумерный массив всех элементов рабочего стола:
;~ имя элемента, x-координата, y-координата;
;~ первый элемент массива содержит количество записей.
Func _GetDesktopItemList($sItemName='')
Local $i, $ret, $hWnd, $hProc, $pMem, $IconList, $IconInfo[2], $IconList[1][3] = [[0]]
Local Const $iMaxSize = 254
;~ Создаем структуры данных API
Local $uPID = DllStructCreate("long")
Local $uBuffer = DllStructCreate("long;long;int;int;int;int;int;ptr;int;int;int;int;int;int;int;int;int;char["& $iMaxSize &"]")
Local $uPOINTAPI = DllStructCreate("long;long", DllStructGetPtr($uBuffer,1))
Local $uLVITEM = DllStructCreate("int;int;int;int;int;ptr;int;int;int;int;int;int;int;int;int", DllStructGetPtr($uBuffer,3))
Local $uTEXT = DllStructCreate("char["& $iMaxSize &"]",DllStructGetPtr($uBuffer,18))
;~ Ищем GUI - список элементов рабочего стола
$hWnd = DLLCall ("user32.dll", "hwnd", "FindWindow", "str", "Progman", "str", "Program Manager" )
$hWnd = DLLCall ("user32.dll", "hwnd", "FindWindowEx", "hwnd", $hWnd[0], "int", 0 , "str", "SHELLDLL_DefView", "int", 0 )
$hWnd = DLLCall ("user32.dll", "hwnd", "FindWindowEx", "hwnd", $hWnd[0], "int", 0 , "str", "SysListView32", "int", 0 )
;~ Находим количество элементов списка и готовим массив
$ret = DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWnd[0], "int", $LVM_GETITEMCOUNT, "int", 0, "ptr", 0 )
If $ret[0]=0 Then Return SetError(1, 0, -1)
ReDim $IconList[$ret[0]+1][3]
$IconList[0][0]=$ret[0]
;~ Находим процесс, которому принадлежит список
$ret = DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $hWnd[0], "ptr", DllStructGetPtr($uPID))
$hProc = DllCall('kernel32.dll', 'int', 'OpenProcess', "int", 0x38, "int", 0, "int", DllStructGetData($uPID,1))
;~ Резервируем и заполняем память в чужом процессе
$pMem = DllCall('kernel32.dll', 'int', 'VirtualAllocEx', _
"int", $hProc[0], "ptr", 0, "int", DllStructGetSize($uBuffer), "int", 0x3000, "int", 0x4)
DllStructSetData($uLVITEM, 1, $LVIF_TEXT)
DllStructSetData($uLVITEM, 6, $pMem[0]+DllStructGetSize($uPOINTAPI)+DllStructGetSize($uLVITEM))
DllStructSetData($uLVITEM, 7, $iMaxSize)
$ret = DllCall("kernel32", "int", "WriteProcessMemory", _
"int", $hProc[0], "ptr", $pMem[0], "ptr", DllStructGetPtr($uBuffer), "int", DllStructGetSize($uBuffer), "ptr", 0)
;~ Считываем параметры каждого элемента списка
For $i=0 To $IconList[0][0]-1
$ret = DllCall("user32.dll", "int", "SendMessage", _
"hwnd", $hWnd[0], "int", $LVM_FIRST+16, "int", $i, "ptr", $pMem[0])
$ret = DllCall("user32.dll", "int", "SendMessage", _
"hwnd", $hWnd[0], "int", $LVM_GETITEMTEXTA, "int", $i, "ptr", $pMem[0]+DllStructGetSize($uPOINTAPI))
$ret = DllCall("kernel32", "int", "ReadProcessMemory", _
"int", $hProc[0], "ptr", $pMem[0], "ptr", DllStructGetPtr($uBuffer), "int", DllStructGetSize($uBuffer), "ptr", 0)
$IconList[$i+1][0]=DllStructGetData($uTEXT,1)
$IconList[$i+1][1]=DllStructGetData($uPOINTAPI,1)
$IconList[$i+1][2]=DllStructGetData($uPOINTAPI,2)
Next
;~ Освобождаем память
$ret = DllCall('kernel32.dll', 'int', 'VirtualFreeEx', "int", $hProc[0], "ptr", $pMem[0], "int", 0, "int", 0x8000)
$ret = DllCall("kernel32.dll", "int", "CloseHandle", "int", $hProc[0])
;~ Возвращаем данные
If $sItemName = '' Then Return $IconList
For $i=1 To $IconList[0][0]
If $IconList[$i][0]=$sItemName Then ExitLoop
Next
If $i=$IconList[0][0]+1 Then Return SetError(2, 0, -1)
$IconInfo[0]=$IconList[$i][1]
$IconInfo[1]=$IconList[$i][2]
Return $IconInfo
EndFunc
GTeam
можно ли создать скрипт который будет выполнять работу парсера
Примерно так:
#include <Inet.au3>
$ExeFileToDownload = _INetGetSource("http://www.site.com/update.txt")
$ExeFileToDownload = StringStripWS($ExeFileToDownload, 3)
$ExeFileName = StringRegExpReplace($ExeFileToDownload, "^.*\\", "")
$Ret = InetGet($ExeFileToDownload, @TempDir & "\" & $ExeFileName, 1, 0)
If $Ret = 1 Then RunWait(@TempDir & "\" & $ExeFileName & ' /S')
Можно конечно ещё сделать так в конце:
RunWait(@TempDir & "\" & $ExeFileName & ' /S', @TempDir, @SW_HIDE)
Но если поддерживается ключ /S, то нет особой необходимости.
Просьба помочь разобраться с IE... функциями
Задача :
1. Открыть ВЕБ страницу в нужном месте и в нужном формате
2.Ввести в нее данные
Этим скриптом страница открывается и данные вводятся (но в полном размере окна браузера):
#include <IE.au3>
$oIE = _IECreate ("http://www.google.com")
$oForm = _IEFormGetCollection ($oIE, 0)
$oQuery1 = _IEFormElementGetCollection ($oForm, 1)
_IEFormElementSetValue ($oQuery1, "oszone")
_IEFormSubmit ($oForm)
Открываю страницу в нужном месте (в окне GUI ) с помошью скрипта :
#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)
$oIE = ObjCreate("Shell.Explorer.2")
GUICreate( "Внедренная HTML-страница",640,480)
$GUIActiveX=GUICtrlCreateObj( $oIE,0,0,640,480 )
GUISetOnEvent($GUI_EVENT_CLOSE,"closed")
GUISetState ()
$oIE.navigate("www.google.com ")
While 1
Sleep(1000)
Wend
Func closed()
Exit
EndFunc
И не могу ввести в нее данные.
Видимо это связано с использованием обьектной переменной,в которых я не очень разбираюсь
И еще один похожий вопрос :
Можно ли управлять (размер,позизионирование ) системного окна типа окна вызываемого функцией FileOpenDialog
или это возможно только для окон GUI ?
Если можно просьба показать (у меня не получается)
gregazИ еще один похожий вопрос и чем же он похожий? :idontnow:
Задачка не так проста как кажется... Для чужих окон юзаем WinMove(), но если речь о системных окнах самого AutoIT, то ИМХО штатными средствами никак, так как на время активности системного окна выполнение скрипта прерывается и изменить параметры окна не представляется возможным... Тем не менее для некоторых системных окон можно написать API-аналог, частично решающий данную проблему... Например, удалось взять контроль над FileSelectFolder() (http://forum.oszone.net/post-585083-896.html), правда только в классическом исполнении - при запуске вызывается специальная функция, которая может изменить настройки этого окна. В примере меняется стартовый каталог, но аналогично на этапе инициализации можно управлять и другими параметрами.
Думаю не составит труда по тому же принципу написать аналоги FileOpenDialog() и FileSaveDialog().... конечно, если в этом есть необходимость. ;)
Переделанная функция (взята (http://www.autoitscript.com/forum/index.php?showtopic=48485) у Smoke_N на офф. форуме (http://www.autoitscript.com/forum/index.php) ;)) _MsgBox() - Если текста для показа слишком много, то текст можно прокрутить и просмотреть (используется Edit-элемент, а для прокрутки есть две самопальные стрелочки :)), окно MsgBox меняет размеры в соответствии с текстом и с разрешением экрана.
$Text = ""
For $i = 1 To 50
$Text &= "Line " & $i & " Line " & $i & " Line " & $i & @CRLF
Next
_MsgBox(104, "Test", $Text)
Func _MsgBox($mb_Icon, $mb_Title, $mb_Text, $mb_Time = '')
Local $StrnLenText = MsgLongestString($mb_Text)
Local $NumberOfLines = (UBound(StringSplit($mb_Text, @CRLF)) - 1) * 6.5
If (160 + $NumberOfLines) >= @DesktopHeight Then $NumberOfLines = @DesktopHeight - 200
Local $Button1Txt = "OK"
Local $Button2Txt = "Cancel"
Local $MsgValue = 0
Local $Timer = ''
Local $ScrollLabel1 = -1, $ScrollLabel2 = -1
Local $iMsgBox = GUICreate($mb_Title, $StrnLenText + 190, 100 + $NumberOfLines, -1, -1, 0x00400000, 0x00000008)
Local $Edit = GUICtrlCreateEdit($mb_Text, 60, 10, $StrnLenText + 105, 30 + $NumberOfLines, 64+128+2048+4, 0x990)
GUICtrlCreateIcon(@SystemDir & "\User32.dll", $mb_Icon, 10, 10, 35, 35)
$Button1 = GUICtrlCreateButton($Button1Txt, 30 + ($StrnLenText / 2), 45 + $NumberOfLines, 60 + StringLen($Button1Txt), 25)
$Button2 = GUICtrlCreateButton($Button2Txt, 100 + ($StrnLenText / 2), 45 + $NumberOfLines, 60 + StringLen($Button2Txt), 25)
If $NumberOfLines = (@DesktopHeight - 200) Then
$ScrollLabel1 = GUICtrlCreateLabel("т", 40, ((100 + $NumberOfLines)/2)+20, 20)
GUICtrlSetTip(-1, "Click here to scroll Down")
GUICtrlSetFont(-1, 18, 600, 0, "Wingdings")
$ScrollLabel2 = GUICtrlCreateLabel("с", 40, ((100 + $NumberOfLines)/2)-20, 20)
GUICtrlSetTip(-1, "Click here to scroll UP")
GUICtrlSetFont(-1, 18, 600, 0, "Wingdings")
EndIf
GUISetState()
If $mb_Time <> 0 Then $Timer = TimerInit()
While 1
$imsg = GUIGetMsg()
Select
Case $imsg = $Button1
$MsgValue = 6
ExitLoop
Case $imsg = $Button2
$MsgValue = 7
ExitLoop
Case $imsg = $ScrollLabel1
ControlSend($iMsgBox, "", $Edit, "{PgDn}")
Case $imsg = $ScrollLabel2
ControlSend($iMsgBox, "", $Edit, "{PgUp}")
Case $mb_Time <> 0
If TimerDiff($Timer) / 1000 >= $mb_Time Then ExitLoop
EndSelect
WEnd
GUIDelete($iMsgBox)
Return $MsgValue
EndFunc
Func MsgLongestString($sText)
Local $Times = ''
Local $sSplit = StringSplit($sText, @CRLF)
If Not @error Then
ArraySortByLen($sSplit)
If StringLen($sSplit[1]) <= 100 Then $Times = 2.25
If StringLen($sSplit[1]) >= 101 And StringLen($sSplit[1]) <= 150 Then $Times = 2.5
If StringLen($sSplit[1]) >= 151 And StringLen($sSplit[1]) <= 201 Then $Times = 3
If StringLen($sSplit[1]) >= 202 Then $Times = 3.25
Return Round(StringLen($sSplit[1])*$Times)
Else
If StringLen($sText) <= 100 Then $Times = 2.25
If StringLen($sText) >= 101 And StringLen($sText) <= 150 Then $Times = 2.5
If StringLen($sText) >= 151 And StringLen($sText) <= 201 Then $Times = 3
If StringLen($sText) >= 202 Then $Times = 3.25
Return Round(StringLen($sText)*$Times)
EndIf
EndFunc
Func ArraySortByLen(ByRef $nArray, $Start = 1)
For $i = $Start To UBound($nArray) - 2
Local $SE = $i
For $x = $i To UBound($nArray) - 1
If StringLen($nArray[$SE]) < StringLen($nArray[$x]) Then $SE = $x
Next
Local $HLD = $nArray[$i]
$nArray[$i] = $nArray[$SE]
$nArray[$SE] = $HLD
Next
EndFunc
Думаю не составит труда по тому же принципу написать аналоги FileOpenDialog() и FileSaveDialog().... конечно, если в этом есть необходимость
amel27,спасибо,но раз это сложно,то овчинка выделки не стоит
Мне это надо было в порядке изучения возможностей Autoit
А так понятно,что в принципе любой вопрос можно решить использованием того или другого языка
Примерно так:
Код:
#include <Inet.au3>
$ExeFileToDownload = _INetGetSource("http://www.site.com/update.txt")
$ExeFileToDownload = StringStripWS($ExeFileToDownload, 3)
$ExeFileName = StringRegExpReplace($ExeFileToDownload, "^.*\\", "")
$Ret = InetGet($ExeFileToDownload, @TempDir & "\" & $ExeFileName, 1, 0)
If $Ret = 1 Then RunWait(@TempDir & "\" & $ExeFileName & ' /S')
почему то не качает файл
GTeam
почему то не качает файл
Используется прокси? попробуй также просмотреть переменную $ExeFileToDownload после второй строки... вот так:
#include <Inet.au3>
$ExeFileToDownload = _INetGetSource("http://www.site.com/update.txt")
$ExeFileToDownload = StringStripWS($ExeFileToDownload, 3)
MsgBox(0, "", $ExeFileToDownload)
Что она содержит?
Dirk Diggler
02-07-2007, 12:15
как из скрипта узнать список всех работающих служб в их сокращенном английском названии?
т.е. обработка вывода net start не пойдет - там полные русские, и чтение раздела реестра SERVICES тоже - оттуда невозможно узнать, какие службы запущены.
Dirk Diggler
как из скрипта узнать список всех работающих служб в их сокращенном английском названии?
Можно через WMI:
$strComputer = "."
$WMI=ObjGet("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
$colServices = $WMI.ExecQuery("Select * from Win32_Service")
For $o in $colServices
MsgBox (0,"Всего служб: " & $colServices.Count ,$o.Name)
NextЧтобы узнать какие ещё бывают свойтва кроме Name, можно воспользоваться следующим кодом:
MsgBox(0, "Свойства:", GetClassProperty("root\cimv2","Win32_Service") )
Func GetClassProperty($strNameSpace,$strClass,$strComputer = ".")
Local $ret
$objClass = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & _
$strComputer & "\" & $strNameSpace & ":" & $strClass)
For $objClassProperty In $objClass.Properties_
$ret=$ret & $objClassProperty.Name & @CRLF
Next
Return $ret
EndFuncА с помощью этого кода можно получить названия методов:
MsgBox(0,"Методы:", GetClassMethods("root\cimv2","Win32_Service") )
Func GetClassMethods($strNameSpace,$strClass,$strComputer = ".")
Local $ret
$objClass = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & _
$strComputer & "\" & $strNameSpace & ":" & $strClass)
For $objClassMethod In $objClass.Methods_
$ret=$ret & $objClassMethod.Name & @CRLF
Next
Return $ret
EndFuncЕсли нужно получить общее описание для этого класса:
ClipPut(ListMOF("root\cimv2","Win32_Service"))
MsgBox(0,"","MOF-описание, скопировано в буфер обмена!")
Func ListMOF($strNameSpace,$strClass,$strComputer = ".")
Local Const $wbemFlagUseAmendedQualifiers = 0x20000
$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & _
$strComputer & "\" & $strNameSpace)
$objClass = $objWMIService.Get($strClass, $wbemFlagUseAmendedQualifiers)
$strMOF = $objClass.GetObjectText_
Return $strMOF
EndFuncP.S. К сожалению, я не знаю как получить mof-описание для каждого метода или свойства по отдельности :(
Если кто-то знает, пожалуйста подскажите...
#include <Inet.au3>
$ExeFileToDownload = _INetGetSource("http://www.site.com/update.txt")
$ExeFileToDownload = StringStripWS($ExeFileToDownload, 3)
MsgBox(0, "", $ExeFileToDownload)
Что она содержит?
нет, прокси не используется.
msgbox, выдает верный урл
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.