Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [архив - Часть 2] AutoIt скрипты

Закрытая тема
Настройки темы
[архив - Часть 2] AutoIt скрипты

(*.*)


Сообщения: 36568
Благодарности: 6698


Конфигурация

Профиль | Сайт | Отправить PM | Цитировать


Изменения
Автор: Vadikan
Дата: 27-01-2008
Внимание!
Тема переведена в архивное состояние







(настоятельно рекомендуется к прочтению/поиску)


Руководство к действию по работе c AutoIt.


Сайт программы
Русская справка
Коллекция AutoIt скриптов от Sanja Alone
Коллекция AutoIt скриптов от MSFN (могут быть устаревшие).
Справочник по командам rundll32 (команды запуска диалоговых окон и не только...)

AutoIt скрипты - введение и FAQ (статья содержит вводную информацию по AutoIt, а также ответы на ЧаВо).



Данная тема предназначена для общих вопросов по AutoIt. Вопросы по установке приложений при помощи AutoIt следует задавать в соответствии с правилами форума "Автоматическая установка приложений". Таким образом, если вы хотите узнать как установить Winamp 5.x при помощи AutoIt, то создайте тему [autoit] Winamp 5.х (если таковой еще нет на форуме). Проверить наличие тем можно при помощи поиска или фильтров.
Цитата Vadikan:
В теме уже свыше 500 сообщений и поиск нужной информации в ней усложняется. Есть предложение собрать все решения (скрипты) и разместить их на Wiki по принципу "один скрипт - одна статья wiki", добавляя статьи в категорию Autoit. Речь, в принципе, идет об общих решениях, а не о скриптах для установки конкретной программы. Название статьи, очевидно, должно отражать назначение скрипта. Затем можно в шапке просто разместить ссылки на статьи Wiki.

-------
Канал Windows 11, etc | Чат @winsiders

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:02, 05-02-2006

 

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Angelus

Цитата:
вместо ввода с клавиатуры допустим...C:\Alcohol Soft......вводится......\A Ї.....
Посылаются латинские символы при не латинской раскладке клавиатуры - с точки зрения AutoIT, нормальное пведение, хотя я сам хотел бы чтобы этого не происходило...
Как вариант менять раскладку перед посыланием символов, либо (намного надёжнее) писать текст используя ControlSetText(), ведь как я поняол нужно вписать текст в определёное поле другого приложения?

Цитата:
Можно ли так обрабатывать текст?
Не желательно, это медлено и не надёжно, там каждую строку открывается файл, пишется в него, и потом закрывается файл (функция _FileWriteToLine()), лучше перечитать весь файл в массив, а потом обрабатывать сам массив...

Я лично такой метод использую:

Код: Выделить весь код
$File = "C:\test.txt"

$Ret = _FileDeleteDuplicates($File, -1)

If $Ret = 1 Then
    MsgBox(64, "", "Was deleted <" & @extended & "> duplicates in file [" & $File & "]")
ElseIf @error Then
    MsgBox(48, "", "File [" & $File & "] was not found.")
EndIf

Func _FileDeleteDuplicates($sFile, $sDirection=-1)
    If Not FileExists($sFile) Then Return SetError(1, 0, -1)
    Local $sFileArray = StringSplit(StringStripCR(FileRead($sFile)), @LF)
    _ArrayDeleteClones($sFileArray, $sDirection)
    Local $Extended = @extended
    If $Extended = 0 Then Return SetError(0, 0, 0)
    Local $hFile = FileOpen($sFile, 130), $LF = @LF
    For $i = 1 To $sFileArray[0]
        If $i = $sFileArray[0] Then $LF = ""
        FileWrite($hFile, $sFileArray[$i] & $LF)
    Next
    FileClose($hFile)
    Return SetError(0, $Extended, 1)
EndFunc

Func _ArrayDeleteClones(ByRef $sArray, $sDirection=-1)
    If Not IsArray($sArray) Then Return SetError(1)
    If UBound($sArray, 0) > 1 Then Return SetError(2)
    Local $NewArr[1], $Extended=0, $FindDuplicate

        For $i = 1 To UBound($sArray)-1
        $FindDuplicate = _FindInArray($sArray, $sArray[$i], $i-1, $sDirection)
        If $FindDuplicate = -1 Then
            ReDim $NewArr[UBound($NewArr)+1]
            $NewArr[UBound($NewArr)-1] = $sArray[$i]
        Else
            $Extended += 1
        EndIf
    Next

        $NewArr[0] = UBound($NewArr) - 1
    $sArray = $NewArr
    Return SetError(0, $Extended, $sArray)
EndFunc

Func _FindInArray(ByRef $Array, $WhatToFind, $StartFrom=1, $sDirection=-1)
    If UBound($Array) < 2 Then Return -1
    Local $iFor = $StartFrom, $iTo = 1, $iStep = -1
    If $sDirection = 1 Then
        $iFor = $StartFrom + 2
        $iTo = UBound($Array)-1
        $iStep = 1
    EndIf

        For $iArr = $iFor To $iTo Step $iStep
        If $Array[$iArr] = $WhatToFind Then Return $iArr
    Next
    Return -1
EndFunc

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:49, 17-08-2007 | #311



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Maza Faka

Ветеран


Сообщения: 604
Благодарности: 133

Профиль | Отправить PM | Цитировать


Creat0R
Красиво, но для меня пока сложновато
Непонятно вот это
Код: Выделить весь код
SetError(1, 0, -1)
, зачем столько значений?

Отправлено: 17:59, 17-08-2007 | #312


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Maza Faka,
Цитата:
зачем столько значений?
Первое задаёт уровень ошибочности, второе нам не нужно в этом случае (расширенное значение содержащееся в макросе @extended на выходе с функции - если функция завершилась удачно, этот макрос будет содержать число произведённых замен в файле), но нужно третье, оно задаёт возвращаемое значение, подобно Return "Value"... таким образом можно проверить что функция завершилась неудачно (файл не найден), не всегда проверяется @error... хотя именно в этом случае, возможно и не нужно возвращать значение, но всё же так положенно (такое поведение наблюдается во многих встроенных функциях).

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 18:21, 17-08-2007 | #313


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Maza Faka, Creat0R

еще два варианта удаления дублей: в 1-м случае файл подается в виде строки, во 2-м как массив строк
Код: Выделить весь код
#include <array.au3>

Func _TextStripDupLines($text)
    If StringRight($text,2)<>@CRLF Then $text &= @CRLF
    Do
        $text = StringRegExpReplace($text,'(?s)(?m)(^[^\n]+\n)(.*?)(^\1)','\1\2')
    Until @extended=0
    Return $text
EndFunc

Func _ArrayDeleteClones($strArray)
    Local $search, $newArray[1]=[0]
    For $i = 1 To $strArray[0]
        $search = -1
        If $i<$strArray[0] Then $search = _ArraySearch($strArray, $strArray[$i], $i+1)
        If $search=-1 Then
            $newArray[0]+=1
            ReDim $newArray[$newArray[0]+1]
            $newArray[$newArray[0]]=$strArray[$i]
        EndIf
    Next
    Return $newArray
EndFunc

Последний раз редактировалось amel27, 18-08-2007 в 12:21. Причина: ошибка в скрипте

Это сообщение посчитали полезным следующие участники:

Отправлено: 07:34, 18-08-2007 | #314


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


amel27,
Цитата:
в 1-м случае файл подается в виде строки
Не перестаю удивляться мощности этого инструмента (Регулярных выражении), ну и конечно твоему умению его использовать
Правда этот метод расчитан только если попадаются как разделители строк @CRLF, а как быть с теми случаями когда строки поделены только лишь @LF/@CR? пробовал похимичить с Pattern, ничего не вышло .

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 07:56, 18-08-2007 | #315


Аватара для Maza Faka

Ветеран


Сообщения: 604
Благодарности: 133

Профиль | Отправить PM | Цитировать


amel27
Немного исправил твой код:
Код: Выделить весь код
#include <Array.au3>
#include <File.au3>

Dim $strArray, $newArray

_FileReadToArray("C:\test.txt", $strArray)
_ArrayDeleteClones($strArray, $newArray)

Func _ArrayDeleteClones($strArray, $newArray)
    Dim $search, $newArray[1]=[0]
    For $i = 1 To $strArray[0]
        $search = $i
        If $i <= $strArray[0] Then $search = _ArraySearch($strArray, $strArray[$i], $i+1)
        If $search = -1 Then
            $newArray[0] += 1
            ReDim $newArray[$newArray[0]+1]
            $newArray[$newArray[0]]=$strArray[$i]
        EndIf
    Next
    _ArrayDisplay($newArray, "Result")
EndFunc
а то последняя строка игнорировалась.
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:17, 18-08-2007 | #316


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата Maza Faka:
последняя строка игнорировалась
ты прав - была ошибка, но так ее править нельзя, так как поиск ведется со следующего элемента... ошибка была строчкой выше.
Цитата Creat0R:
как быть с теми случаями когда строки поделены только лишь @LF/@CR?
RegExp распознает начало/конец строки только на основании @LF, а вот @CR является "лишним балластом" и без него можно обойтись... хотя без @CR из-за "+" пустые строки будут игнорироваться ("*" ставить нельзя!) Как вариант - использовать StringAddCR() и StringStripCR().

З.Ы. На самом деле AutoIT поддерживает не все возможности регулярных выражений, поэтому приходится выкручиваться.

Последний раз редактировалось amel27, 19-08-2007 в 02:58.


Отправлено: 12:17, 18-08-2007 | #317


Аватара для Maza Faka

Ветеран


Сообщения: 604
Благодарности: 133

Профиль | Отправить PM | Цитировать


amel27
В итоге сделал так:
Код: Выделить весь код
#include <Array.au3>
#include <File.au3>

Dim $strArray, $newArray

_FileReadToArray("C:\test.txt", $strArray)
_ArrayDeleteClones($strArray, $newArray)
_ArrayDisplay($newArray, "Result")

Func _ArrayDeleteClones($strArray, ByRef $newArray)
    Dim $search, $newArray[1]=[0]
    For $i = 1 To $strArray[0]
        $search = _ArraySearch($strArray, $strArray[$i], $i+1)
        If $search = -1 Then
            $newArray[0] += 1
            ReDim $newArray[$newArray[0]+1]
            $newArray[$newArray[0]]=$strArray[$i]
        EndIf
    Next
EndFunc
сойдёт или нет?

Отправлено: 13:26, 18-08-2007 | #318


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Maza Faka

я тут подумал насчет твоего варианта - почему он работает хотя вроде не должен... ведь действительно, если использовать встроенную защиту _ArraySearch() код можно еще сократить
Код: Выделить весь код
#include <array.au3>
#include <file.au3>

Dim $a, $f = 'c:\test.txt'
_FileReadToArray($f, $a)
_FileWriteFromArray($f,_ArrayDeleteClones($a),1)

Func _ArrayDeleteClones($strArray)
    Local $newArray[1]=[0]
    For $i = 1 To $strArray[0]
        If _ArraySearch($strArray, $strArray[$i], $i+1)<0 Then
            $newArray[0]+=1
            ReDim $newArray[$newArray[0]+1]
            $newArray[$newArray[0]]=$strArray[$i]
        EndIf
    Next
    Return $newArray
EndFunc

Последний раз редактировалось amel27, 19-08-2007 в 02:36.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:22, 18-08-2007 | #319


Аватара для Maza Faka

Ветеран


Сообщения: 604
Благодарности: 133

Профиль | Отправить PM | Цитировать


amel27
Цитата amel27:
почему он работает хотя вроде не должен

-------
Сообщение помогло? Не забудьте нажать на Полезное сообщение


Отправлено: 19:21, 18-08-2007 | #320



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [архив - Часть 2] AutoIt скрипты

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Открывая 7z архив пишет не удаётся открыть как архив. Можно ли его восстановить? DreDo Хочу все знать 4 01-12-2009 18:54
[Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:. Vadikan AutoIt 1543 18-01-2009 10:46
[Архив - Часть 1.3] AutoIt скрипты biork AutoIt 503 09-06-2007 11:27
[Архив - Часть 1.2] AutoIt скрипты Dirk Diggler AutoIt 505 02-12-2006 11:00
[Архив - Часть 1.1] AutoIt скрипты EgOrus AutoIt 335 04-02-2006 16:58




 
Переход