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

» AutoIT

Автор: timsky
Дата сообщения: 26.10.2008 23:31
NIKZZZZ
Только хотел то же самое посоветовать

Tipulatoid
Я вообще ни одну доку по регэкспам не читал. Если есть задача и я не знаю как решить - открываю вышеуказанную софтину и в течение 1 минуты получаю то, что нужно.
Автор: Maza Faka
Дата сообщения: 27.10.2008 06:24
ssgdvlpr

Цитата:
Я хочу полностью переименовать диск D: на М:


Код:
diskpart.exe /?
Автор: IgRo
Дата сообщения: 27.10.2008 07:25
Maza Faka
Из SolidWorks API
Description
This method gets the position of this annotation.
Syntax (OLE Automation)
retval = Annotation.GetPosition ( )
Return:    
(VARIANT) retval    
VARIANT SafeArray of doubles
У меня не один метод возвращающий массив не работает в AutoIt (в VBA всё работает) наверное не знаю волшебных слов AutoIT`a. Подскажите пожалуйста.
Автор: Maza Faka
Дата сообщения: 27.10.2008 08:04
IgRo
А где у тебя в коде создаётся обьект?
Автор: ssgdvlpr
Дата сообщения: 27.10.2008 09:31
Maza Faka
Как выполнять WinWaitActive ( "title" [, "text" [, timeout]] ), если title одинаковый, а видимого text нет, как например в Acronis

Может есть скрытый текст?
Цитата:
[/q]

скрытого тоже нет

[q]diskpart.exe /?

а что в файле сценария пищется, и какое расширение у него?


Автор: Maza Faka
Дата сообщения: 27.10.2008 11:05
ssgdvlprssgdvlpr

Цитата:
скрытого тоже нет

Хм... можно попробовать сравнивать строку с классами в цикле, что-то вроде этого:

Код:
$sText = WinGetClassList("[CLASS:Notepad]")

While WinGetClassList("[CLASS:Notepad]") = $sText
    Sleep(100)
WEnd
Автор: Pravokonst
Дата сообщения: 27.10.2008 11:06
Подскажите, плиз, как сделать, чтобы при выборе папки из всех подпапок создавался массив папок.

Заранее спасибо.
Автор: Maza Faka
Дата сообщения: 27.10.2008 11:15
Pravokonst
Пример1
Пример2
Автор: Nikkorot
Дата сообщения: 27.10.2008 11:34
Добрый день!Покажите пожалуйста рабочий пример работы с ftp - получить список файлов из определённого каталога, всё что здесь было не помогло. Не могу справиться. Спасибо.
Автор: telyakov
Дата сообщения: 27.10.2008 12:29
Народ!

Вчера попробовал пример копирования большого файла из верхних
Копирование большого файла с отображением данных прогресса


Код:
#include <DllCallBack.au3>

_FileCopyEx("C:\BigFile.avi", @ScriptDir & "\BigFile.avi")

Func _FileCopyEx($Source, $Dest)
If Not FileExists($Source) Then Return SetError(1)
ProgressOn("_FileCopyEx() Demo", "Копирование, ждите плиз...")
$pCopyProgressRoutine = _DllCallBack("_CopyProgressRoutine", "uint64;uint64;uint64;uint64;dword;dword;ptr;ptr;ptr")
DllCall("kernel32.dll", "int", "CopyFileExA", _
"str", $Source, _
"str", $Dest, _
"ptr", $pCopyProgressRoutine, _
"ptr", 0, _
"int", 0, _
"int", 0)
_DllCallBack_Free($pCopyProgressRoutine)
Sleep(1000)
ProgressOff()
EndFunc

Func _CopyProgressRoutine($TotalFileSize, $TotalBytesTransferred, $StreamSize, $StreamBytesTransferred, $dwStreamNumber, $dwCallbackReason, $hSourceFile, $hDestinationFile, $lpData)
$Precent = $TotalBytesTransferred/$TotalFileSize*100
ProgressSet($Precent, "Проценты: " & Round($Precent, 1) & " %")
Return 0
EndFunc ;==>_CopyProgressRoutine
Автор: Maza Faka
Дата сообщения: 27.10.2008 13:20
telyakov

Цитата:
попробовал пример копирования большого файла

Пример
Автор: ViSiToR
Дата сообщения: 27.10.2008 13:22
Pravokonst 11:06 27-10-2008
Цитата:
чтобы при выборе папки из всех подпапок создавался массив папок

См. в шапке, там есть нужные функции.

telyakov 12:29 27-10-2008
Цитата:
он выпадает с ошибкой

Как пробовали и с какой ошибкой?


Цитата:
Может уже есть более новая библиотека DllCallBack.au3

Нет, эти функции переписали во встроенные, вот новая версия:


Код: _FileCopyEx("C:\BigFile.avi", @ScriptDir & "\BigFile.avi")

Func _FileCopyEx($sSource, $sDest)
If Not FileExists($sSource) Then Return SetError(1)
ProgressOn("_FileCopyEx() Demo", "Копирование, ждите плиз...")

Local $hCopyProgressRoutine = DllCallbackRegister("_CopyProgressRoutine", "int", _
"uint64;uint64;uint64;uint64;dword;dword;ptr;ptr;ptr")

DllCall("kernel32.dll", "int", "CopyFileExA", _
"str", $sSource, _
"str", $sDest, _
"ptr", DllCallbackGetPtr($hCopyProgressRoutine), _
"ptr", 0, _
"int", 0, _
"int", 0)

DllCallBackFree($hCopyProgressRoutine)

Sleep(1000)

ProgressOff()
EndFunc

Func
_CopyProgressRoutine($TotalFileSize, $TotalBytesTransferred, $StreamSize, $StreamBytesTransferred, $dwStreamNumber, $dwCallbackReason, $hSourceFile, $hDestinationFile, $lpData)

Local $iPrecent = $TotalBytesTransferred/$TotalFileSize * 100
ProgressSet($iPrecent, "Проценты: " & Round($iPrecent, 1) & " %")

Return 0
EndFunc
Автор: telyakov
Дата сообщения: 27.10.2008 13:41
Друзья, Спасибо!

Действительно оба ответа очень уместны!
Тогда намекните в какую сторону рыть,
чтобы так красиво копировать директорию?!

С уважением Алик Теляков
Автор: lex83_2002
Дата сообщения: 27.10.2008 13:45
Как считать все значения из GUICtrlCreateList не выделяя их, т.е считать все перебором
в массив ?
Автор: Tipulatoid
Дата сообщения: 27.10.2008 13:51
Nikkorot

Цитата:
Добрый день!Покажите пожалуйста рабочий пример работы с ftp - получить список файлов из определённого каталога, всё что здесь было не помогло. Не могу справиться. Спасибо.


Скачиваешь отсюда zip архив(последний), берешь из него .ftp.au3, переименовываешь его в ftp.au3, кидаешь в папку Include (c:\program files\autoit3\include) и используешь такой код:


Код: #include <ftp.au3>
#include <Array.au3>

$server = 'ftp.narod.ru'
$username = 'delta-greit'
$pass = 'не_скажу'
$dir = '/Greit4/Semifinals/'

$Hand = _FTPOpen('Doesnt Matter')
$Ftpc = _FTPConnect($Hand, $server, $username, $pass)
if @error then
    MsgBox(0,"Error","Connect Error")
    Exit
EndIf

Dim $aFileList[1]
$Ftpff= _FTPFileFindFirst($Hand, $dir)
_ArrayAdd ($aFileList, $Ftpff[10])

While 1
$file = _FTPFileFindNext($Hand)
If @error Then ExitLoop
_ArrayAdd ($aFileList, $file[10])
WEnd

$Ftpffc = _FTPFileFindClose($Hand)
$Ftpc = _FTPClose($Hand)

_ArrayDisplay($aFileList)
Автор: Nikkorot
Дата сообщения: 27.10.2008 14:46
Спасибо большое,всё получилось.
Автор: ViSiToR
Дата сообщения: 27.10.2008 19:17
lex83_2002 13:45 27-10-2008
Цитата:
Как считать все значения из GUICtrlCreateList не выделяя их

Так:


Код: #include <GuiConstants.au3>
#include <GuiListBox.au3>
#include <Array.au3>

$GUI = GUICreate("Test Script", 300, 200)

$List = GUICtrlCreateList("", 20, 10, 260, 150)
GUICtrlSetData(-1, "Line 1|Line 2|Line 3")

$Read_Button = GUICtrlCreateButton("Read", 20, 170, 60, 20)

GUISetState(@SW_SHOW, $GUI)

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case
$Read_Button
$sList_String
= ""
$iCount = _GUICtrlListBox_GetCount($List)

For $i = 0 To $iCount-1
$sList_String &= _GUICtrlListBox_GetText($List, $i) & @CRLF
Next

$aListArray = StringSplit(StringStripWS($sList_String, 3), @CRLF, 1)

_ArrayDisplay($aListArray)
EndSwitch
WEnd
Автор: IgRo
Дата сообщения: 27.10.2008 21:54
Maza Faka

Код:
$swApp = ObjGet("", "SldWorks.Application")
$swModel = $swApp.ActiveDoc
$swView = $swDraw.GetFirstView
$swNote = $swView.GetFirstNote
$swAnn = $swNote.GetAnnotation
$vAnnPos = $swAnn.GetPosition
MsgBox(1, $swNote.GetText, "x=" & $vAnnPos[0] & "y=" & $vAnnPos[1] & "z=" & $vAnnPos[2])

Автор: ViSiToR
Дата сообщения: 27.10.2008 22:45
IgRo 21:54 27-10-2008
Цитата:
На VBA GetAnnotation возвращает массив vAnnPos, а на AutoIT нет

А если так:


Код: Dim $aAnnPos[3]

For $iPos In $vAnnPos
$aAnnPos
[$iPos] = $vAnnPos.Name
Next

MsgBox(1, $swNote.GetText, "x=" & $aAnnPos[0] & "y=" & $aAnnPos[1] & "z=" & $aAnnPos[2])
Автор: IgRo
Дата сообщения: 27.10.2008 22:54
ViSiToR
В результате
AutoIt v3: autoit3.exe - Ошибка приложения
Инструкция по адресу "0x0042afa9" обратилась к памяти ....
Память не может быть "read"


Добавлено:
MsgBox(1,"",UBound ( $vAnnPos)) ---> 0
Автор: NORIO
Дата сообщения: 27.10.2008 23:48
Как получить список контролов в окне? Нужно получить список их хендлов.
Автор: ViSiToR
Дата сообщения: 28.10.2008 01:36
IgRo 22:54 27-10-2008
Цитата:
AutoIt v3: autoit3.exe - Ошибка приложения

Никогда подобного от аутоита не встречал. Возможно это из за переполнения буфера (памяти?)...


Цитата:
MsgBox(1,"",UBound ( $vAnnPos))   --->  0

К сожалению подобные проблемы трудно решать в теории, приведи рабочий пример, который можно запустить и увидеть проблему.

И кстати, а почему вместо ObjCreate используется ObjGet? ведь в примере на vba используется CreateObject

Добавлено:
NORIO 23:48 27-10-2008
Цитата:
Как получить список контролов в окне? Нужно получить список их хендлов.

В шапке есть функция для получения пронумерованного списка классов окна, вот на каждый класс нужно применить ControlGetHandle().

Добавлено:
Вот так примерно:


Код: #include <Array.au3>

Run(@WindowsDir & "\Notepad.exe")
WinWait("[CLASS:Notepad]")

$aHandles = _WinGetCtrlHandlesList("[CLASS:Notepad]")

_ArrayDisplay($aHandles, "Notepad's Control's Handles List")

Func _WinGetCtrlHandlesList($sTitle, $sText="")
Local $aRetHandles[1][1]
Local $aClassList = StringSplit(_WinGetNumeratedClassList($sTitle), @CRLF, 1)

For $i = 1 To $aClassList[0]
$aRetHandles[0][0] += 1
ReDim $aRetHandles[$aRetHandles[0][0]+1][2]

$aRetHandles[$aRetHandles[0][0]][0] = $aClassList[$i]
$aRetHandles[$aRetHandles[0][0]][1] = ControlGetHandle($sTitle, "", $aClassList[$i])
Next

Return
$aRetHandles
EndFunc

Func
_WinGetNumeratedClassList($sTitle, $sText="")
Local $sClassList = WinGetClassList($sTitle, $sText)
Local $aClassList = StringSplit($sClassList, @CRLF)
Local $sRetClassList = "", $sHold_List = "|"
Local $aiInHold, $iInHold

For $i = 1 To UBound($aClassList) - 1
If $aClassList[$i] = "" Then ContinueLoop

If
StringRegExp($sHold_List, "\|" & $aClassList[$i] & "~(\d+)\|") Then
$aiInHold = StringRegExp($sHold_List, ".*\|" & $aClassList[$i] & "~(\d+)\|.*", 1)
$iInHold = Number($aiInHold[UBound($aiInHold)-1])

If $iInHold = 0 Then $iInHold += 1

$aClassList[$i] &= "~" & $iInHold + 1
$sHold_List &= $aClassList[$i] & "|"

$sRetClassList &= $aClassList[$i] & @CRLF
Else
$aClassList[$i] &= "~1"
$sHold_List &= $aClassList[$i] & "|"
$sRetClassList &= $aClassList[$i] & @CRLF
EndIf
Next

Return
StringReplace(StringStripWS($sRetClassList, 3), "~", "")
EndFunc
Автор: Tipulatoid
Дата сообщения: 28.10.2008 10:32
Можно попросить слить этот код в одну строку. По отдельности работают вроде:
regexp2.au3 :
Код: #include <Array.au3>

$sReadFile = FileRead ("z2_full.txt")

$aContents =
StringRegExp($sReadFile, '(?im)^From: +(.*)(?: |<)(?:.*?<|)(.*?)(?:>|)\r\n', 1) ; сохраняет имя отправителя и его адрес
$aContents = StringRegExp($sReadFile, '(?im)^To: +(.*)(?: |<)(?:.*?<|)(.*?)(?:>|)\r\n', 1) ; сохраняет имя получателя и его адрес
$aContents = StringRegExp($sReadFile, '(?im)^Subject: +(.*)\r\n', 1) ; сохраняет тему письма
$aContents = StringRegExp($sReadFile, '(?ims) filename="?(.*?)(?:"|\r).*?\n\r\n(.*?)\r\n^-+', 3) ; сохраняет имена и тела всех аттачей


; _ArrayDisplay ($aContents)
For $i = 0 To UBound ($aContents) - 1
ConsoleWrite ($aContents[$i] & @CRLF)
Next


Автор: lex83_2002
Дата сообщения: 28.10.2008 11:22
[
Цитата:


Advanced MemberРедактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

lex83_2002 13:45 27-10-2008
Цитата:Как считать все значения из GUICtrlCreateList не выделяя их

Так:


Код:#include <GuiConstants.au3>
#include <GuiListBox.au3>
#include <Array.au3>

$GUI = GUICreate("Test Script", 300, 200)

$List = GUICtrlCreateList("", 20, 10, 260, 150)
GUICtrlSetData(-1, "Line 1|Line 2|Line 3")

$Read_Button = GUICtrlCreateButton("Read", 20, 170, 60, 20)

GUISetState(@SW_SHOW, $GUI)

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $Read_Button
$sList_String = ""
$iCount = _GUICtrlListBox_GetCount($List)

For $i = 0 To $iCount-1
$sList_String &= _GUICtrlListBox_GetText($List, $i) & @CRLF
Next

$aListArray = StringSplit(StringStripWS($sList_String, 3), @CRLF, 1)

_ArrayDisplay($aListArray)
EndSwitch
WEnd


----------
ViSiToR a.k.a CreatoR
CreatoR это не ник, CreatoR это стиль жизни!



Большое спасибо !
Автор: Nikkorot
Дата сообщения: 28.10.2008 13:12
подскажите как создаётся многомерный массив?
Автор: ViSiToR
Дата сообщения: 28.10.2008 13:51
Tipulatoid 10:32 28-10-2008
Цитата:
слить этот код  в одну строку

Это уже будет сложновато для дальнейшего разбора. Лучше в цикле в один массив совместить:


Код: #include <Array.au3>

$sReadFile = FileRead ("z2_full.txt")

$aContents_From = StringRegExp($sReadFile, '(?im)^From: +(.*)(?: |<)(?:.*?<|)(.*?)(?:>|)\r\n', 1) ;Имя отправителя и его адрес
$aContents_To = StringRegExp($sReadFile, '(?im)^To: +(.*)(?: |<)(?:.*?<|)(.*?)(?:>|)\r\n', 1) ;Имя получателя и его адрес
$aContents_Subject = StringRegExp($sReadFile, '(?im)^Subject: +(.*)\r\n', 1) ;Тема письма
$aContents_Attach = StringRegExp($sReadFile, '(?ims) filename="?(.*?)(?:"|\r).*?\n\r\n(.*?)\r\n^-+', 3) ;Имена и тела всех аттачей

Dim $aContents_All[UBound($aContents_From)][4]

For $i = 0 To UBound($aContents_From) - 1
$aContents_All[$i][0] = $aContents_From[$i]
$aContents_All[$i][1] = $aContents_To[$i]
$aContents_All[$i][2] = $aContents_Subject[$i]
$aContents_All[$i][3] = $aContents_Attach[$i]
Next

For
$i = 0 To UBound($aContents_All) - 1
ConsoleWrite($aContents_All[$i][0] & @CRLF)
Next
Автор: telyakov
Дата сообщения: 28.10.2008 14:01
Друзья, Извиняюсь!

Намекните, пожалуйста, в какую сторону рыть,
чтобы красиво копировать директорию?!
или покажите пример типа DirCopyEx

Заранее Спасибо!
С уважением Алик Теляков
Автор: Nikkorot
Дата сообщения: 28.10.2008 14:39
Спасибо, а родных функций получается нет ? Получается на каждый столбец по функции.
Автор: Maza Faka
Дата сообщения: 28.10.2008 15:41
telyakov

Цитата:
красиво копировать директорию

Так достаточно красиво?

Код: _FileCopy("D:\wallpaper", "e:\test")

;~ 16 Respond with "Yes to All" for any dialog box that is displayed.
;~ 256 Display a progress dialog box but do not show the file names.


Func _FileCopy($Source, $Dest)
Local $FOF_RESPOND_YES = 16
Local $FOF_SIMPLEPROGRESS = 256

If Not FileExists($Dest) Then DirCreate($Dest)

$objShell = ObjCreate("Shell.Application")
$objFolder = $objShell.NameSpace($Dest)
$objFolder.CopyHere($Source)
EndFunc
Автор: Tipulatoid
Дата сообщения: 28.10.2008 15:46
Visitor, спасибо
Итак парсер электронной почты. Думаю, такая штука нужна не только мне. Удобна при использовании _pop3.au3 UDF Функция возвращает массив, где сохранены:
В 1-ой строке - имя отправителя
во 2-ой строке - адрес отправителя
в 3-ей строке - имя получателя
в 4-ой строке - адрес получателя
в 5-ой строке - тема письма
в 6-ой строке - кодировка письма
в 7-ой строке - тело письма
в 8-ой строке - имя аттача (если есть)
в 9-ой строке - тело аттача (если есть)
В следующих парах строк - имена и тела других аттачей (если есть)
parser.au3 :
Код: #include <Array.au3>
#include <_pop3.au3>

Global $MyPopServer = "pop.yandex.ru"
Global $MyLogin = "delta2-greit"
Global $MyPasswd = "не_скажу"


; Подключаемся к pop3 серверу
_pop3Connect($MyPopServer, $MyLogin, $MyPasswd)
If @error Then
MsgBox(16, "Ошибка. Код ошибки " & @error, "Не могу подключиться к " & $MyPopServer)
Exit
Else
ConsoleWrite("Подключился к pop3-серверу " & $MyPopServer & @CR)
EndIf
; Скачиваем письмо №1
Local $retr = _Pop3Retr(1)
If Not @error Then
$aParsedLetter =
_ParseEmail ($retr) ; посылаем скачанное письмо на разбор
Else
ConsoleWrite("Команда Retr не прошла" & @CR)
Exit
EndIf
; Закрываем подключение
ConsoleWrite(_Pop3Quit() & @CRLF)



_ArrayDisplay ($aParsedLetter)





Func
_ParseEmail ($sReadFile)
Dim $aLetter[1]
_AddToLetterArray (StringRegExp($sReadFile, '(?im)^From: +(.*)(?: |<)(?:.*?<|)(.*?)(?:>|)\r\n', 1), $aLetter) ; отправитель
_AddToLetterArray (StringRegExp($sReadFile, '(?im)^To: +(.*)(?: |<)(?:.*?<|)(.*?)(?:>|)\r\n', 1), $aLetter) ; получатель
_AddToLetterArray (StringRegExp($sReadFile, '(?im)^Subject: +(.*)\r\n', 1), $aLetter) ; тема
_AddToLetterArray (StringRegExp($sReadFile, '(?i) charset="?(.*?)(?:"|\r\n)', 1), $aLetter) ; кодировка
; тело письма
$aSplit = StringSplit ($sReadFile, @CRLF, 1)
$iFirstBoundaryString =
_ArraySearch ($aSplit, "boundary=", 0, 0, 0, 1)
$iBoundary = $aSplit[$iFirstBoundaryString]
$iBoundary_startpos = StringInStr ($iBoundary, '"')
$iBoundary_endpos = StringInStr ($iBoundary, '"', 0, 2)
$boundary = StringMid ($iBoundary, $iBoundary_startpos+1, $iBoundary_endpos-$iBoundary_startpos-1)
$boundary1 =
_ArraySearch ($aSplit, $boundary, $iFirstBoundaryString+1, 0, 1, 1)
$boundary2 =
_ArraySearch ($aSplit, $boundary, $boundary1+1, 0, 1, 1)
$message = ""
$Write =
False
For $i=$boundary1 To $boundary2-1
If $aSplit[$i] = "" Then $Write =
True
If $Write = True Then $message &= $aSplit[$i] & @CRLF
Next
_AddToLetterArray ($message, $aLetter)

_AddToLetterArray (StringRegExp($sReadFile, '(?ims) filename="?(.*?)(?:"|\r).*?\n\r\n(.*?)\r\n^-+', 3), $aLetter) ; имена и тела аттачей

Return $aLetter
EndFunc
; ==> _ParseEmail

Func _AddToLetterArray ($aContents, ByRef $afLetter)

If IsArray($aContents) Then
For
$t = 0 to UBound ($aContents) - 1
_ArrayAdd ($afLetter, $aContents[$t])
Next
Else
_ArrayAdd ($afLetter, $aContents)
EndIf


Return
$afLetter
EndFunc
;==>_AddToLetterArray

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

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


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