В Autoit бывают ситуации, когда какое нибудь действие легче сделать с помощью других скриптов, например общение с АД, да мало ли бывает ситуций. При этом так же важно иметь отклик от данного скрипта, что бы можно было среагировать на поступающие ошибки или мы просто хотим получить данные.
Предлагаю несколько вариантов вставок.
Запуск VBS из AutoIt:
Рассмотрим следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Local $Code = "" $Code &= 'On Error Resume Next' & @LF $Code &= 'Function up(i2)' & @LF $Code &= 'UP=i2+1' & @LF $Code &= 'End Function' & @LF $Code &= 'Function Test(i)' & @LF $Code &= ' Dim k' & @LF $Code &= ' Dim Res' & @LF $Code &= ' Res=1' & @LF $Code &= ' For k = 1 To i' & @LF $Code &= ' Res=up(Res)' & @LF $Code &= ' Next' & @LF $Code &= ' Test=Res' & @LF $Code &= 'End Function' & @LF Local $VbsObj = ObjCreate("ScriptControl") If @error Then Return SetError(1, 0, -1) $VbsObj.Language = "vbscript" $VbsObj.AddCode($Code) $Res =$VbsObj.Run("Test", 20) |
1 |
Local $Code = "" |
Объявляем переменную $Code, в эту переменную мы будем записывать код на VBS
Не буду подробно описывать код который я использую на VBS, так как функции и реализация надуманны
Обращу ваше внимание на следующие моменты:
4 |
$Code &= 'Function up(i2)' & @LF |
Здесь мы объявляем функцию UP которая возвращает значение параметра i2 увеличенное на 1
8 |
$Code &= 'Function Test(i)' & @LF |
Здесь мы бъявляем вторую функцию Test с параметром i
13 |
$Code &= ' Res=up(Res)' & @LF |
В ней мы можем использовать объявленные в этом коде функции, в нашем примере функция up
16 |
$Code &= 'End Function' & @LF |
На этой строчке мы закончили наполнять переменную $Code.
18 |
Local $VbsObj = ObjCreate("ScriptControl") |
$VbsObj становится ссылкой на COM объект «ScriptControl»
10 |
If @error Then Return SetError(1, 0, -1) |
Проверяем удачность предыдущего события
20 |
$VbsObj.Language = "vbscript" |
Указываем язык нашего кода в переменной $Code — «vbscript»
21 |
$VbsObj.AddCode($Code) |
Добавляем наш код в этот ком объект
1 |
$Res =$VbsObj.Run("Test", 20) |
$VbsObj.Run(«Test», 20)- Запускаем функцию Test где 20 это параметр i, результатом функции $VbsObj.Run будет результат возвращённый функцией «Test». И соответственно он присвоится переменной $Res
Запуск PowerShell из AutoIt или обратный отклик от EXE :
Иногда хочется не только запустить утилиту через AutoIt, но и посмотреть, что она выдала в консоли.
Разберём следующий скрипт:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Func _OEM2ANSI($what) $ret = DllCall('user32.dll', 'Int', 'OemToChar', 'str', $what, 'str','') Return $ret[2] EndFunc ;==>_OEM2ANSI $Cmd = 'Get-Process' $PowerShell = Run('PowerShell.exe '&$Cmd, "", @SW_HIDE , $STDERR_CHILD + $STDOUT_CHILD + $STDIN_CHILD) StdinWrite($PowerShell) $line="" $lineData="" $lineError="" While 1 $line = StdoutRead($PowerShell) If @error Then ExitLoop $lineData &=_OEM2ANSI($line) Wend While 1 $line = StderrRead($PowerShell) If @error Then ExitLoop $lineError &=_OEM2ANSI($line) Wend |
1 |
Func _OEM2ANSI($what) |
Из за того, что в консоли виндовс нам выдаются надписи в кодировке OEM2, а AutoIt работает с ANSI, то без перекодировки не обойтись если нам нужен отклик от программы.
2 3 |
$ret = DllCall('user32.dll', 'Int', 'OemToChar', 'str', $what, 'str','') Return $ret[2] |
Для перекодировки используем библиотеку user32.dll c помощью функции DllCall.
Её первый параметр используемая библиотека(user32.dll),
второй тип результата функции(Int),
третий сама функция из библиотеки (OemToChar),
четвёртый тип первого параметра(str),
пятый непосредственно сам параметр(параметр нашей функции $watch),
шестая тип втого параметра(str),
седьмая значение второго параметра(»)
6 |
$Cmd = 'Get-Process' |
Здесь пишем команды на PowerShell не забываем, что это будет папаметр к PowerShell.exe, так что всё в одну строчку ипользуем ‘;’ если надо разделить команды.
7 |
$PowerShell = Run('PowerShell.exe '&$Cmd, "", @SW_HIDE , $STDERR_CHILD +$STDOUT_CHILD + $STDIN_CHILD) |
Запускаем PowerShell.exe с параметром $Cmd, при этом запуск будет не заметным для пользователя (@SW_HIDE)
$STDIN_CHILD заставляет использовать указатель дочернего потока STDIN
$STDOUT_CHILD заставляет использовать указатель дочернего потока STDOUT
$STDERR_CHILD заставляет использовать указатель дочернего потока STDERR
8 |
StdinWrite($PowerShell) |
Забираем потоки вывода которые были сформированны при запуске нашего приложения
10 11 12 |
$line="" $lineData="" $lineError="" |
Эти переменные понадобятся нам, для того что бы забрать данные из потоков вывода
13 14 15 16 17 |
While 1 $line = StdoutRead($PowerShell) If @error Then ExitLoop $lineData &=_OEM2ANSI($line) Wend |
Здесь мы забираем данные из потока STDOUT по строчно($line = StdoutRead($PowerShell)).
И записываем в переменную, не забыв их преобразовать в нужную кодировку из OEM2 в ANSI ($lineData &=_OEM2ANSI($line))
Так как этих данных может быть больше одной строчки, то забираем в цикле пока не появится какая либо ошибка, например кончились данные.
18 19 20 21 22 |
While 1 $line = StderrRead($PowerShell) If @error Then ExitLoop $lineError &=_OEM2ANSI($line) Wend |
Тоже самое делаем с данными попавшими в поток ошибок StderrRead.
Антон, здравствуйте.
Я пытаюсь освоить программу AutoIT, но не получается. Не могли бы Вы подсказать мне, чтобы дело сдвинулось.
Мне нужно:
1. Считать число с экрана сайта (вручную это — выделить, скопировать)
2. Обработать это число (это я знаю — это моя программа)
3. Записать результат обработки (число) в поле на другом сайте (вручную я делаю так — выделяю имеющееся значение, и на его место вставляю новое)
4. Нажать ввод для выполнения.
Буду признателен за помощь.
С уважением,
Виктор.
Ответ на первый пункт
Ответ на 3 и 4 пункт
Антон,
Спасибо, что уделили мне внимание.
Мой уровень это — начальный Basic. Поэтому, пока, я мало что понял, но буду разбираться.
Я посмотрел, что такое Парсинг и мне показалось, что это не совсем то, что мне нужно.
Если Вы можете уделить мне еще немного внимания — у меня просьба — давайте я пошлю Вам на эл. почту поясняющую картинку. Тогда Вы поймете, что нужно мне, а я буду знать в каком направлении мне двигаться.
С уважением,
Виктор.
Антон,
По пп. 3,4 идея мне понятна, буду пробовать практически реализовать это.
Спасибо Вам.
Я отправил письмо, на почту которую вы указали, при публикации комментария.
Здравствуйте Антон. Скажите пожалуйста мне нужен скрипт на вход на сайт(браузер моззила, тор, яндекс) и автозаполнения логина и пароля где я могу это найти? Благодарю.
Здравствуйте.
Если вы хотите, что бы открывался браузер, в нём открывался сайт и потом вводилие логин и пароль. И при этом вы хотите использовать тор браузер основанный на мозиле……
Ну можно попытаться допустим тем же AutoIT открыть браузер и после длительного ожидания начать в слепую посылать в браузер символы. Но это жутко не стабильно.
Есть специальный продукт ZennoPoster, зверёк платный. Но там есть всё и поиск прокси и программирование и капчу разгадывать можно попытаться. И многопоточность.
Можно движок Gecko поковырять. Это кокраз фаерфокс, но там надо попатеть, что бы и тор прикрепить и настроить автоматизацию.
Есть какой то плагин под написание скриптов подо фаерфокс, но я чёт и забыл как его зовут… и вопрос можно ли такую штуку прикреплять к тор браузеру …
В общем вопрос не тривиальный 🙂
Ещё под фаерфокс есть плагин автозаполнитель форм… но опять же это всё для меня противоречит идеологии тора 🙂
Очень нужен скрипт для autoit
Проверить наличие любого файла с расширениями * .doc, *.odt в папке на диске D и открыть окно, если файл там появился. Спасибо. Анна.