Ru-Board.club
← Вернуться в раздел «Программы»

» AutoIT

Автор: Nikkorot
Дата сообщения: 20.11.2008 12:51
Помогите,почему не работает функция RunAsSet ?
Starting AutoIt3Wrapper v.1.10.1.12
ERROR: RunAsSet(): undefined function

И ещё не могу получить данные из консоли.Пользовался примером из этого форума:

Func _Ping($HostName, $TimeOut=4000)
Local $ReadStd = ''
Local $CMDPid = Run(@ComSpec & ' /c Ping ' & $HostName & ' -w ' & $TimeOut, '', @SW_HIDE, 2 + 4)
While 1
$ReadStd &= StdoutRead($CMDPid)
If @error Then ExitLoop
WEnd

$ReadStd = StringMid($ReadStd, StringInStr($ReadStd, '=', 0, 2), 6)
$ReadStd = StringRegExpReplace($ReadStd, '[^0-9]', '')
Return Number($ReadStd)
EndFunc

Функция ничего не возвращает, скрипт запускает сам себя в цикле до бесконечности.
В справке нашёл пример:

; Demonstrates ReadStdout()
AutoItSetOption("ProvideRunStdout", 1)
AutoItSetOption("ProvideRunStderr", 1)

$foo = Run(@ComSpec & " /c dir C:\1")

While 1
$line = StdoutRead($foo)
If @error = -1 Then ExitLoop
MsgBox(0, "STDOUT read:", $line)
Wend

While 1
$line = StderrRead($foo)
If @error = -1 Then ExitLoop
MsgBox(0, "STDERR read:", $line)
Wend

MsgBox(0, "Debug", "Exiting...")

Компилятор возвращает:

: ERROR: AutoItSetOption() called with illegal argument 1: "ProvideRunStdout"

В чём причина ? Может у меня версия Autoit не та ?
Автор: telyakov
Дата сообщения: 20.11.2008 13:12
Вопрос: Как программно открыть окно печати принтера средствами AutoIT?

Заранее Спасибо!
Алик Теляков
Автор: Tipulatoid
Дата сообщения: 20.11.2008 14:02
Nikkorot

Цитата:
И ещё не могу получить данные из консоли.Пользовался примером из этого форума:

У меня так все работает:

Код: $Host = "www.google.com"
$foo = _Ping ($Host)
ConsoleWrite ($foo & @CRLF)


Func _Ping($HostName, $TimeOut=4000)
    Local $ReadStd = ''
    Local $CMDPid = Run(@ComSpec & ' /c Ping ' & $HostName & ' -w ' & $TimeOut, '', @SW_HIDE, 2 + 4)
    While 1
        $line = StdoutRead($CMDPid)
        If @error Then ExitLoop
        If $line <> "" Then $ReadStd &= $line
    WEnd
    $ReadStd = StringMid($ReadStd, StringInStr($ReadStd, '=', 0, 2), 6)
    $ReadStd = StringRegExpReplace($ReadStd, '[^0-9]', '')
    Return Number($ReadStd)
EndFunc
Автор: Nikkorot
Дата сообщения: 20.11.2008 14:32
Tipulatoid


Цитата:
из справки:

Код:16th May, 2008 - v3.2.12.0

AutoIt:
....
Removed: RunAsSet(). (Replaced with RunAs() and RunAsWait())




Понятно, спасибо. Пользовался русской справкой.

А пинг и из вашего примера не пашет,всё тоже самое. Скрипт сам себя плодит в трее до бесконечности и никакого толку,непонятно.....
Автор: Tipulatoid
Дата сообщения: 20.11.2008 14:59
Nikkorot

Цитата:
А пинг и из вашего примера не пашет,всё тоже самое. Скрипт сам себя плодит в трее до бесконечности и никакого толку,непонятно.....

Не знаю в чем причина. Попробуй(те) после каждой строки скрипта вставить ConsoleWrite (ok1 & @CRLF), ConsoleWrite (ok2 & @CRLF) и т.д. Так можно вычленить на какой строке глюки начинаются и дальше уже конкретно думать
Автор: ViSiToR
Дата сообщения: 20.11.2008 15:59
telyakov 14:12 20-11-2008
Цитата:
Как программно открыть окно печати принтера средствами AutoIT?


Пример 1:

Код: #include <GuiConstantsEx.au3>
#include <ButtonConstants.au3>

$sFile = @ScriptDir & "\test.txt"

$GUI = GUICreate("Print Demo", 300, 100)

GUICtrlCreateLabel("File Path:", 20, 22)
$Input = GUICtrlCreateInput($sFile, 80, 20, 200, 20)

$Print_Button = GUICtrlCreateButton("Print", 20, 50, 260, 32, $BS_ICON)
GUICtrlSetImage(-1, "shell32.dll", -17)

GUISetState(@SW_SHOW, $GUI)

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case
$Print_Button
$sFile
= GUICtrlRead($Input)
Run('Rundll32.exe "' & @SystemDir & '\mshtml.dll",PrintHTML "' & $sFile & '"', @SystemDir)
EndSwitch
WEnd
Автор: gal7
Дата сообщения: 20.11.2008 20:39
Мне нужно запустить Perl скрипт из AutoIt-а, так чтобы получить Pid (чтобы потом пользоваться консолью), но ничего не выходит. Run только для выполняемых файлов, да? Подскажите, пожалуйста, как это сделать попроще какая функция нужна. В списке запущенных процессов могут быть несколько процессов perl.exe, как отличить нужный?

Добавлено:
Опа, получилось, оказывается для такого все же работает Run:

Код: Run(@ComSpec & " /c " & 'perl ' & @ScriptDir & '\script.pl', @ScriptDir, @SW_SHOW, $STDIN_CHILD + $STDOUT_CHILD))
Автор: CrazyNNM
Дата сообщения: 20.11.2008 22:11
чтоб запустить файл допустим перла через Run, тебе потребуется указать сначала чем его открыть, следом, что открыть
ну типа
Run ( @SystemDir &"/rundll32.exe netshell.dll,StartNCW") ;эта фича запускает визард создания подключений

это запустит файл netshel.dll c параметром через программу rundll.exe

ну в общем, ты понял принцип)))
Автор: Zev78
Дата сообщения: 21.11.2008 03:29
Извиняюсь за туой вопрос, но как работать с массивами ?

Dim $lastdigit, $tim=0
$lastdigit [0] = "none"
$lastdigit[1] = "none"

Вот такая хрень, написанная после #EndRegion ### END Koda GUI section ###
Не выдает ошибок при проверке синтаксиса, а при запуске моментально вылетает и выкидывает
$lastdigit [0] = "none"
$lastdigit ^ ERROR
>Exit code: 1 Time: 0.207

Может косяк операционки ? У меня Vista Home Premium
Спасибо.

Добавлено:
На мой тупой вопрос отвечать не надо, просто инициализация массивов описана в другом месте, я правда с трудо.ю но нашел.
Автор: gal7
Дата сообщения: 21.11.2008 08:16

Цитата:
чтоб запустить файл допустим перла через Run, тебе потребуется указать сначала чем его открыть, следом, что открыть

Спасибо, CrazyNNM. Наконец получилось Оказывается путь был с пробелом, а после преобразования все заработало.
Автор: Nikkorot
Дата сообщения: 21.11.2008 09:10
Пытаюсь скомпилировать скрипт для разукраски кода, скачаный у ViSiToR, выдает кучу ошибок:

: ERROR: Opt() called with illegal argument 1: "RunErrorsFatal"
Opt("RunErrorsFatal", 0)
: ERROR: $WS_MAXIMIZEBOX: undeclared global variable.
    $WS_MAXIMIZEBOX+
: ERROR: _GUICtrlEditSetSel(): undefined function.
    _GUICtrlEditSetSel($ScriptContent, 0, StringLen(GUICtrlRead($ScriptContent)))

В чём причина может быть ?
Автор: Maza_Faka
Дата сообщения: 21.11.2008 09:44
Nikkorot

Цитата:
Пытаюсь скомпилировать скрипт для разукраски кода


Цитата:

выдает кучу ошибок


2 ViSiToR
Друг, выложи в шапку скомпилированный Скрипт расскраски кода AutoIt. Если проблемы с FTP, то залей временно на какой-нибудь файлообменник, я потом перезалью на свой сервер.
Автор: Nikkorot
Дата сообщения: 21.11.2008 10:19
Покажите пожалуйста рабочий код работы с консолью, ну хоть убейте, не получается отправить-получить данные в-из консоли программно. В примере из хелпа (ConsoleRead) ручками получается из cmd перенаправить, а скриптом никак нет.

Добавлено:
пробую скрипт со строкой

Local $Get = Run(@ComSpec & " /c Ping " & $HostName & " -w " & $TimeOut, "", @SW_SHOW, 2 + 4)

Запускается cmd, но с пустым окном..... А должно быть как ?
Автор: CrazyNNM
Дата сообщения: 21.11.2008 11:31
ты напиши сначала в командной строке ping /?
у тебя просто синтаксис неправильный)))) должно быть так

Local $Get = Run(@ComSpec & " /c Ping " & "-w" & " 5000"& " localhost")

ну там свои переменные подставишь;)
Автор: Nikkorot
Дата сообщения: 21.11.2008 11:55
CrazyNNM

Спасибо, а считать ответ как ?
Автор: CrazyNNM
Дата сообщения: 21.11.2008 15:05
а что тебе именно считать надо?
просто результат вообще-то в твою переменную возвращается
думаю, это отклик в мс.
Автор: NIKZZZZ
Дата сообщения: 21.11.2008 18:29
Кто-нибудь разбирался с Obfuscator.exe ?
В принципе, нормально работает , исключая в .au3 файле лишний мусор, сокращая размер .exe файла, (к стати, позволяет заменить все #include, вставляя только нужные компоненты и константы, то-есть можно получить рабочий .au3 скрипт без #include), но упорно отказывается понимать ключи, хотя в логе пишет, что он их скушал.
Запускал его из командной строки - тот-же результат.
Автор: Zwook
Дата сообщения: 21.11.2008 19:45
Впервые на форуме, и сразу к делу.

№1 Где можно найти хороший справочник по созданию интерфейса в autoit ?
№2 Можно ли как нибудь вести счет над тем сколько раз запускалась функции без уродливых методов типо $a = $a+1
№3 Почему нету команды Go To и можно ли её чем нибудь заменить? (Я новичок в autoit)
№4 Есть ли в autoit возможности распознование текста? Хотябы такого текста который можно скопировать в буфер обмена и вставить в блокнот (То есть не растеризированный текст)
№5 Можно ли сделать так чтобы скрипт работал в одном окне, когда пользователь работает в другом. Порывшись в help'e узнал, что ControlSend должен делать нечто подобное, но совсем ничего не понял

Заранее спасибо за ответы!
Автор: ViSiToR
Дата сообщения: 21.11.2008 20:04
Zwook 20:45 21-11-2008
Цитата:
Где можно найти хороший справочник по созданию интерфейса в autoit ?

Справка прилагаемая к аутоиту + «AutoIt v3: Your Quick Guide» из шапки.


Цитата:
Можно ли как нибудь вести счет над тем сколько раз запускалась функции без уродливых методов типо $a = $a+1

А почему это уродливые методы? кстати вместо $a = $a + 1 лучше использовать $a += 1 .


Цитата:
Почему нету команды Go To и можно ли её чем нибудь заменить?

Её замена это циклы (Do...Untill, While...WEnd, For...Loop).


Цитата:
Можно ли сделать так чтобы скрипт работал в одном окне, когда пользователь работает в другом

Смотря что требуется выполнить.

Добавлено:
Maza_Faka 10:44 21-11-2008
Цитата:
выложи в шапку скомпилированный Скрипт расскраски кода AutoIt

Позже выложу, кстати новая версия уже планируется
Автор: Zwook
Дата сообщения: 21.11.2008 20:42

Цитата:
А почему это уродливые методы? кстати вместо $a = $a + 1 лучше использовать $a += 1 .

Насколько я понял в сложных скриптах эти переменные будут меняться, то есть $a = 0 после нескольких выполнений циклов будет $a = X>0. (Другими словами переменная поменяется и потеряет начльное значение)

Цитата:
Смотря что требуется выполнить.

Допустим ввод текста.

Вы кстати неответили на вопрос №4:

Цитата:
№4 Есть ли в autoit возможности распознование текста? Хотябы такого текста который можно скопировать в буфер обмена и вставить в блокнот (То есть не растеризированный текст)



Спасибо за оперативный ответ!



#Edit:

Вот теперь по настоящему сверх важный вопрос! Допустим у меня есть:

Код:
Do
MouseClick("left", 500, 500)
Until [Чего нибудь, не важно]
Автор: Loopback
Дата сообщения: 21.11.2008 21:25

Цитата:
Можно ли как нибудь сделать так

Сделать можно всё, что угодно, было бы время и желание

Цитата:
чтобы после каждого цикла Do | Until значения MouseClick менялись, например сначало координаты 500,500 потом 560,560 потом опять 500,500 и.т.д.

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

Код: $b = False
Do
If
$b Then
MouseClick("left", 560, 560)
Else
MouseClick("left", 500, 500)
EndIf
$b = BitNot($b)
Until "[Чего нибудь, не важно]"
Автор: ViSiToR
Дата сообщения: 21.11.2008 21:30
Zwook 21:42 21-11-2008
Цитата:
асколько я понял в сложных скриптах эти переменные будут меняться

А для чего нужен подобный подсчёт? Вот небольшой пример:


Код:
Global $iEnter_Func1_Counter = 0
Global $iEnter_Func2_Counter = 0

For $i = 1 To 10
If $iEnter_Func1_Counter < 9 Then Call("TestFunc_1") ;Вызываем пока не будет начислено 9 раз
Call("TestFunc_2")
Next

MsgBox(64, "", StringFormat("TestFunc_1() Calls: %i\nTestFunc_2() Calls: %i", $iEnter_Func1_Counter, $iEnter_Func2_Counter))

Func TestFunc_1()
$iEnter_Func1_Counter += 1

;Тут тело функции
EndFunc

Func
TestFunc_2()
$iEnter_Func2_Counter += 1

;Тут тело функции
EndFunc
Автор: Zwook
Дата сообщения: 21.11.2008 22:05

Цитата:
Global $aCoords = StringSplit("500|500|560|560|500|500", "|")

;Do
For $i = 1 To $aCoords[0] Step 2 ;Т.к у нас парные значения, задаём циклу интервал выполнения
MouseClick("Left", $aCoords[$i], $aCoords[$i+1])
Next
;Until True


Гениально! Я опробовал и все работает именно так, как надо


Цитата:
Есть, если речь про OCR то на оф. форуме было много примеров разной сложности.


Спасибо за ссылку! Когда будет свободное время пойду изучать



Цитата:
Можно, но опять таки, тут много факторов играют роль. Если к примеру есть возможность узнать идентификатор элемента (контрола), то можно работать с ControlSetText().


Видел в help'e много про это, тоже буду изучать =)



Остальное мне вроде бы понятно.

Цитата:

Global $iEnter_Func1_Counter = 0
Global $iEnter_Func2_Counter = 0

For $i = 1 To 10
If $iEnter_Func1_Counter < 9 Then Call("TestFunc_1") ;Вызываем пока не будет начислено 9 раз
Call("TestFunc_2")
Next

MsgBox(64, "", StringFormat("TestFunc_1() Calls: %i\nTestFunc_2() Calls: %i", $iEnter_Func1_Counter, $iEnter_Func2_Counter))

Func TestFunc_1()
$iEnter_Func1_Counter += 1

;Тут тело функции
EndFunc

Func TestFunc_2()
$iEnter_Func2_Counter += 1

;Тут тело функции
EndFunc


Вот тут возникают проблемы.

#1 Что из себя представляет "iEnter_Func1/2_Counter" ? Точнее чем оно отличается просто от $i
#2 Чем отличается Call от простого вызова функции путем ИмяФункции() ?



Цитата:
$b = False
Do
If $b Then
MouseClick("left", 560, 560)
Else
MouseClick("left", 500, 500)
EndIf
$b = BitNot($b)
Until "[Чего нибудь, не важно]"


Ничего личного но у ViSiToR пример более вдохновляющий Спасибо за информацию!
Автор: ViSiToR
Дата сообщения: 21.11.2008 22:30
Zwook 23:05 21-11-2008
Цитата:
Что из себя представляет "iEnter_Func1/2_Counter" ? Точнее чем оно отличается просто от $i

Ничем, это просто имена переменных, можно их назвать просто $Schetchik_1/2


Цитата:
Чем отличается Call от простого вызова функции путем ИмяФункции() ?

В данном случае разницы нет. Но вообще Call приминяется если нужно вызвать функцию из переменной, пример:


Код:
$MyFunc = "SomeFunc" ;Тут имя функции может быть считано к примеру с ini-файла.
$MyFunc_Params = "Параметры" ;Также и параметры можно считывать, но это и при обычном вызове актуально

;Сам вызов функции на основе её имени из переменной

Call($MyFunc, $MyFunc_Params)

Func SomeFunc($sParams)
MsgBox(64, "", $sParams)
EndFunc
Автор: Zwook
Дата сообщения: 21.11.2008 22:46
Вот поковыряся я с "MouseClick("left", $aCoords[$i], $aCoords[$i+1])"и возник вопрос. А как сделать так, чтобы значение массива менялась каждый раз когда цикл заново начнется? Вот к примеру я добавил в цикл $a += 1, как мне указать массиву чтобы менялся только при $a увеличившемуся на 1 по отношению прошлого выполнение цикла? (Надеюсь хоть кто нибудь меня понял)

Пример:


Код:
For $i = 1 To 10
If $iEnter_Func1_Counter < 9 Then Call("Loop") ;Вызываем пока не будет начислено 9 раз
Call("Checker")
Next


Func Loop()
While 1
Do
Sleep(50)
$Checker = PixelSearch(500, 500, 500, 500, 0xffffff) ;Тут в принципе может быть все, что угодно.
Until IsArray($Checker)
If IsArray($Checker) Then
For $a = 1 To $aCoords[0] Step 2 ;Как указать чтобы менялся с каждым разом когда меняется $i вместо того чтобы исполнятся до тех пор пока массив не кончится?
MouseClick("left", $aCoords[$a], $aCoords[$a+1])
Next
Sleep(2500)
EndIf
Wend
EndFunc
Автор: ViSiToR
Дата сообщения: 22.11.2008 00:36
Zwook 23:46 21-11-2008
Цитата:
как сделать так, чтобы значение массива менялась каждый раз когда цикл заново начнется?

Задать значение всему массиву, или отдельным элементам? для отдельных ячеек задаётся значение так:


Код: $aArray[N] = "Новое значение"
Автор: Zwook
Дата сообщения: 22.11.2008 10:20
Вобщем возникли кое какие затруднения.

Во первых я правильно сформулировал мой предыдущий вопрос: Необходимо чтобы менялось только два значения в массиве за один цикл. То есть, если у меня массив:

Код:
Global $aCoords = StringSplit("500|500|560|560|500|500|190|380", "|")
Автор: Nikkorot
Дата сообщения: 22.11.2008 10:43
CrazyNNM


Цитата:
а что тебе именно считать надо?
просто результат вообще-то в твою переменную возвращается
думаю, это отклик в мс.


Пишу:

$HostName = 'www.mail.ru'
$TimeOut = '4000'

Local $Get = Run(@ComSpec & " /c Ping " & $HostName & " -w " & $TimeOut, "", @SW_HIDE)

$ReadCmd = ''

While 1
$ReadCmd &= StdoutRead($Get)
If @error Then ExitLoop
WEnd

MsgBox(0, "PING",$ReadCmd)

Возвращается пустое окно, почему ?



Автор: Leagnus
Дата сообщения: 22.11.2008 11:06
П.ч. нет флага $STDOUT_CHILD к потоку вывода.
Также, я бы прежде, чем выводить в окно DOS-овскую кодировку – обработал бы её функцией

Код: Func OemToChar($szSrc)
; http://www.autoitscript.com/forum/index.php?showtopic=70836&st=0&p=518726&#entry518726
;~ Private Declare Function OemToChar Lib "user32.dll" Alias "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long

Local $placeholder
For $i = 0 To StringLen($szSrc)
$placeholder &= " "
Next
Local
$lRetVal = DllCall("user32.dll", "long", "OemToChar", "str", $szSrc, "str", $placeholder)
If IsArray($lRetVal) And $lRetVal[0] = 1 Then
Return
SetError(0, 0, $lRetVal[2])
EndIf

Return
SetError(1, 0, "")
EndFunc ;==>OemToChar
Автор: Maza_Faka
Дата сообщения: 22.11.2008 11:58
Zwook

Цитата:
выполнятся одновременно в том же цикле

Ну создай необходимое кол-во циклов.


Цитата:
И в итоге ничего не происходит...

И правильно делает, что не происходит. Где у тебя функция опроса GUI? Читаем:
GUI Concepts
GUI MessageLoop Mode
GUI OnEvent Mode

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

Предыдущая тема: Quintura Search


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.