Войти

Показать полную графическую версию : [архив - Часть 2] AutoIt скрипты


Страниц : 1 2 3 [4] 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

Diamond
21-06-2007, 03:03
Creat0R
Ну почему, в массив то попадают все строки с нужным текстом, а зачем в массиве символы перевода строки и возврата каретки?
Ни один из символов перевода строки, в массив не попадают. (у меня)
И кстати, при чтении всего файла, совсем не обязательно использовать FileGetSize()
Енто вопрос не ко мне а, к автору функции: _FileReadToArray() ;) - раз уж он так зделал, то и я вслед за ним не стал это исправлять.
А разве в этом примере символы перевода строки и возврата каретки не заменятся на символ новой строки? может при делении на массив нужно использовать @LF а не @CR?
А, какая разница?
На всякий случай поясню:
Допустим в одном файле могут встретится 3 различных типа завершения строки, с помощью StringRegExpReplace() я последовательно меняю все @CRLF на @CR, затем @LF на @CR, в конечном счёте в тексте остаётся только @CR который я использую в качестве разделителя.
Но можно использовать и @LF - не вижу разницы...$aArray = StringSplit(StringRegExpReplace(FileRead($hFile),"\r\n|\r",@LF),@LF)

Diamond
21-06-2007, 04:42
proxy
Diamond, спасибо. Необходимое с тектом реализовал уже по другому, а пример приму на заметку, чувствую дальше понадобиться.
Я бы посоветовал использовать UDF'ную функцию _FileReadToArray(), для считывания файла в массив но считаю, что в некоторых случаях она может сработать некорректно...
Хотя с другой стороны, кроме меня пока ещё никто не жаловался...#include <File.au3>
Dim $FileArray
_FileReadToArray("C:\1.txt",$FileArray)
$hFile = FileOpen("C:\1.txt",2)
$LineFeed = @CRLF
For $i=1 To $FileArray[0]
If $i = $FileArray[0] Then $LineFeed = ''
If $FileArray[$i] <> "Ненужная строка" Then
FileWrite($hFile, $FileArray[$i] & $LineFeed)
EndIf
Next
FileClose($hFile)

Creat0R
21-06-2007, 06:52
Diamond
в конечном счёте в тексте остаётся только @CR который я использую в качестве разделителя
А разве \n это @CR, мне казалось что \r это @CR, а \n это @LF, именно с этого и исходили мои вопросы.

А на счёт изменения функции _FileReadToArray(), я так и не понял, зачем превращать все переводы строк и возврата каретки в символ возврата кареткми (или наоборот :wacko: , не очень уж важно), потом делить всё это в массив, когда при этом, ни символ возврата каретки, ни символ перевода строки, не попадает в массив :idontnow: - У тебя случалось что не все строки с файла попадали в массив?

Так вроде правильнее:

$aArray = StringSplit(StringRegExpReplace(FileRead($hFile),"\n|\r",@LF),@LF)

По поводу функции для замены текста в файле...

Вот моя версия на подобную функцию:


$Ret = ReplaceText("C:\test.txt", "Old Text", "New Text")
ConsoleWrite($Ret & @LF & @extended)

Func ReplaceText($FileName, $OldText, $NewText)
If Not FileExists($FileName) Then Return SetError(1, 0, -1)
If $OldText = "" Then Return SetError(2, 0, 0)
$OldText = String($OldText)

Local $hFile = FileOpen($FileName, 0)
Local $VarToWrite = FileRead($hFile)
FileClose($hFile)
If Not StringInStr($VarToWrite, $OldText) Then Return SetError(3, 0, 0)

Local $ReplStr = StringReplace($VarToWrite, $OldText, $NewText)
Local $Extended = @extended

Local $hFileW = FileOpen($FileName, 2)
FileWrite($hFileW, $ReplStr)
FileClose($hFileW)
Return SetError(0, $Extended, 1)
EndFunc

Creat0R
21-06-2007, 07:13
Diamond
Дааа, оказывается ты прав.... возьмём этот пример:


#include <Array.au3>
#include <File.au3>

Dim $Array

FileWrite("test.txt", "Line1" & @LF & "Line2" & @CR & "Line3" & @LF & "Line4")

_FileReadToArray("test.txt", $Array)

_ArrayDisplay($Array)


Получается такой массив:

[1] = "Line1"
[2] = "Line2Line3"
[3] = "Line4"

Если применять этот же пример используя изменённую функцию _FileReadToArray(), то мы получаем “нормальный” массив (как и записи в файле) :

[1] = "Line1"
[2] = "Line2"
[3] = "Line3"
[4] = "Line4"

Вот полная функция как она, имхо, должна быть построена:


Func _FileReadToArray($sFilePath, ByRef $aArray)
;==============================================
; Local Constant/Variable Declaration Section
;==============================================
Local $hFile = FileOpen($sFilePath, 0)

If $hFile = -1 Then Return SetError(1)

$aArray = StringSplit(StringRegExpReplace(FileRead($hFile),"\r|\n", @LF), @LF)

FileClose($hFile)
Return 1
EndFunc ;==>_FileReadToArray


Хм.. надо бы её автору маякнуть об этом.... а ещё лучше, сразу в баг репорт запостить на оф. форум, привести пример что эта функция может возвращать не корректные данные...

Creat0R
21-06-2007, 07:35
Но всё же остаётся одна проблема - если в файле содержатся промежуточные символы перевода строки (@LF), то гинерируется пустой элемент массива...

Получается это ошибка функции StringSplit() ?

amel27
21-06-2007, 08:36
Diamondчтобы произвести добавление, удаление или замену элементов, массивы используют UDF-функцииХм... Добавление в конец массива можно сделать через ReDim(), вставку в середину массива без UDF не осуществить в обоих случаях.... Физическое удаление элементов массива проводить не обязательно - достаточно "пометить" их и не использовать при обработке.... по замене не понял - это же обычное присвоение.

Diamond, Creat0R ...по поводу _FileReadToArray():

- у StringSplit() есть флаг, позволяющий использовать более одного символа для разбиения:$a = StringSplit ($text, @CRLF, 1)- уж коли зашла речь про StringRegExp(), то она вполне самодостаточна:$a = StringRegExp ($text, '(?m)^(.*)$', 3)Creat0Rоно вообще реализуемо?ИМХО в общем виде - нет, иначе можно было бы без проблем подчинить себе любое окно, скажем тот же IE... Видимая "подчиненность" отражает классовую сущность окон, поэтому они должны быть как минимум в одном процессе... В случае с MsgBox() код расшарен через DLL и запускается в текущем потоке, поэтому подчинение реализуемо.

eNcub
21-06-2007, 09:40
eNcub
Цитата:Если это окно не появляется, то нажатие стрелки вверх и энтера всё равно производится


Попробуй так:

Код:

WinWaitActive('Мастер новых подключений', 'Выберите, надо ли автоматически подключаться к Интернету', 5)
If WinActive('Мастер новых подключений', 'Выберите, надо ли автоматически подключаться к Интернету') Then Send('{UP}{ENTER}')

:(... попробовал, ничего не изменилось...
еще мысли есть у кого-нибудь? плз..

XXXler
21-06-2007, 10:59
eNcub,

$Wtitle="Мастер новых подключений"
$Wtext="Выберите, надо ли автоматически подключаться к Интернету"
$Timeout=30

WinWait($Wtitle,$Wtext,$Timeout)
If WinExists($Wtitle,$Wtext) Then
If Not WinActive($Wtitle,$Wtext) Then WinActivate($Wtitle,$Wtext)
If WinWaitActive($Wtitle,$Wtext,$Timeout) Then Send("{UP}{ENTER}")
EndIf


если я правильно понял цель написания скрипта, то проще использовать твик реестра :)

eNcub
21-06-2007, 12:10
XXXler

таак, а что с реестром? этот вариант тоже не прошел...

amel27
21-06-2007, 12:17
schel4okА кто-нибудь знает как запускать inf файлы при помощи AutoIt?вот функция, запускающая произвольную секцию INF-файла… К сожалению, прямой вызов функции InstallHinfSection (http://msdn2.microsoft.com/en-us/library/aa376957.aspx) из setupapi.dll не сработал… :idontnow: Func _RunInfSection ($filepath, $section = 'DefaultInstall', $mode = 128)
If Not(FileExists($filepath)) Then Return -1
Local $ret = RunWait ('rundll32 setupapi,InstallHinfSection '& $section &' '& $mode &' '& FileGetLongName($filepath,1), @SystemDir, @SW_HIDE)
Return $ret
EndFuncproxyот таких добавлений мои функции разростаются как на .....сникерсах и чипсах
хм, а свою dll тут ни как не создать? что просто вызывать когда необходимо?чем не устраивает UDF?.. чтобы текст скрипта не разрастался, выделите функции в AU3-файл(ы) и загружайте через #include в заголовке скрипта...

Creat0R
21-06-2007, 20:03
amel27
у StringSplit() есть флаг, позволяющий использовать более одного символа для разбиения:
Я его пробовал, в этом случае он всё ровно добавляет в массив пустую строку...

уж коли зашла речь про StringRegExp(), то она вполне самодостаточна:
Этот пример должен возвращать массив с подделенными строками на @LF? возвращается массив с одним пустым, и при чём нудевым элементом :idontnow:

schel4ok
Я сразу не понял что речь идёт об установке файла, а не его запуске (это ведь требуется?)...
Для установки действительно будет полезна функция предложенная amel27 чуть выше, сам нечто подобным пользуюсь для установки Inf файлов (правда из батника ;) ).

gvshil
21-06-2007, 22:15
Помогите, пожалуйста, разобраться:

While 1
ControlClick ('Abbyy FineReader Professional v8.0 keygen', '', 'Button4' ) ;генерация серийника
$GetSN=ControlGetText ('Abbyy FineReader Professional v8.0 keygen', '', 'Edit1' )
; ввод серийника
ControlSetText ('ABBYY FineReader 8.0 Professional Edition Try&Buy', '&Введите серийный номер', 'Edit1', $GetSN)
ControlClick('ABBYY FineReader 8.0 Professional Edition Try&Buy', '&Введите серийный номер', 'Button1')
;если серийник не верен, то появляется окно
;('ABBYY FineReader 8.0 Professional Edition Try&Buy', 'Проверьте правильность введенного серийного номера.')
If WinExists ('ABBYY FineReader 8.0 Professional Edition Try&Buy', 'Проверьте правильность введенного серийного номера.') Then ContinueLoop
If Not WinWaitActive ('ABBYY FineReader 8.0 Professional Edition Try&Buy', 'Проверьте правильность введенного серийного номера.',5) Then
WinActivate ('ABBYY FineReader 8.0 Professional Edition Try&Buy', 'Проверьте правильность введенного серийного номера.')
ControlClick ('ABBYY FineReader 8.0 Professional Edition Try&Buy', 'Проверьте правильность введенного серийного номера.','Button1'); не закрывает окно
; Send ( '{ENTER}' ) тоже не закрывает это окно
EndIf
ExitLoop
Wend

Info окна

>>>> Window <<<<
Title: ABBYY FineReader 8.0 Professional Edition Try&Buy
Class: #32770
Position: 332, 333
Size: 366, 126
Style: 0x94C801C5
ExStyle: 0x00010101

>>>> Control <<<<
Class: Button
Instance: 1
ID: 2
Text: ОК
Position: 478, 422
Size: 75, 23
ControlClick Coords: 35, 11
Style: 0x50030000
ExStyle: 0x00000004

>>>> Mouse <<<<
Position: 178, 71
Cursor ID: 0
Color: 0xE9F1F5

>>>> StatusBar <<<<

>>>> Visible Text <<<<
ОК
Проверьте правильность введенного серийного номера.

Окно не закрывается и все идет по кругу, т.е. генерация и серийника и появление еще одного окна

proxy
21-06-2007, 22:57
Diamond, спасибо за подсказки, это очень интересно.
Сейчас считываю весь файл в gui List и от него "играю",
но как варинат с текстом в масиве.....может пригодится.

Creat0R - спасибо за пример, Diamond пару постов выше
уже показал твой пример. Я сейчас изменел первичный замысел
и сейчас не требуется замена тсрок, но на вооружение взял.


И ещё, скромный вопрос, auto IT это замечательно, но создовать
уж созданное думаю нет серьезного смысла.....может знакомы
с языком С++ , VB, ..... что лучше применить к изучению для
написания подобных приложений?

п.с.: я не сравниваю аутоИТ и другие языки, я хочу понять
какой, в целом, язык оптимальние и приняться к его изучению.

Creat0R
21-06-2007, 23:08
gvshil
Окно не закрывается и все идет по кругу
Иногда даже закрытие окна, на самом деле его не удаляет из списка существующих окон, а просто скрывает, поэтому думаю нужно проверять видимость окна...


If _WinIsVisible('ABBYY FineReader 8.0 Professional Edition Try&Buy', 'Проверьте правильность введенного серийного номера.') Then ContinueLoop

Func _WinIsVisible($Title, $Text)
Return BitAND(WinGetState($Title, $Text), 2)
EndIf


proxy
что лучше применить к изучению для
написания подобных приложений?
Каких приложении?

AutoIt в основном предназначен для написания скриптов в помощь автоматизации запуска/установки приложении и ежедневных системных задач, но кроме этого на нём также возможно писать программы среднего (а может и высшего) уровня.

какой, в целом, язык оптимальние и приняться к его изучению
AutoIt написан на C++, думаю что именно изучение C++ и будет оптимальным языком программирования (это конечно, очень и очень Имхо ;)).

gvshil
21-06-2007, 23:26
Creat0R
Совсем я запутался.
Если не трудно, укажите куда конкретно в моем примере нужно вставить проверку.

Creat0R
22-06-2007, 00:54
gvshil
куда конкретно в моем примере нужно вставить проверку.
Вместо всех функции проверки на существование окна (WinExists()). А саму функцию _WinIsVisible в конец файла.

Dirk Diggler
22-06-2007, 01:00
Написал скрипт для архивирования.
если кому надо, поюзайте, расскажете, как оно....

вот, из ридмишки.
1. ВВЕДЕНИЕ

Когда-то я пользовался nnBackup. Но ограничение в 2Гб на архив меня убивало. И убивает посейчас. Кроме того, nnBackup, как и многие архиваторы, использующиеся для резервного копирования, не умеют архивировать открытые другими программами файлы(дружно вспомним базы 1С).
И вот, я решил устранить эти недостатки. Эти устранил. вроде бы. А вот чего этот скрипт не умеет, см. в самом конце.


2. ОПИСАНИЕ

Данный скрипт представляет собой "оболочку" для архиватора 7-zip(www.7-zip.org) начиная с версии 7.47.
Основное назначение - резервное архивирование данных.

Diamond
22-06-2007, 01:40
Creat0R
Так вроде правильнее:
Если в файл добавить следущую комбинацию:
$file = FileOpen("test.txt",2)
FileWrite($file,"" & @CRLF)
FileWrite($file,"" & @CRLF)
FileWrite($file,"" & @CRLF)
То твоя функция возвращает массив из 7 пустых строк, хотя на самом деле строк 4.
Необходимо учитывать все возможные типы завершения строк, как я уже сказал, всего их 3. (...правда, редактор "Notepad.exe" об этом не знает.)
Если автор UDF-функции упустил из виду @CR - то ты, в данном случае проигнорировал @CRLF.
Опишу всё подробно:$hFile = FileOpen("test.txt", 0)

$text = FileRead($hFile)
$text = StringRegExpReplace($text,"\r\n",@LF) ; заменяем все комбинации @CRLF на @LF
$text = StringRegExpReplace($text,"\r",@LF) ; заменяем все оставшиеся @CR на @LF
; И теперь, когда мы точно уверены что все строки завершаются только символом @LF - делим текст:
$aArray = StringSplit($text,@LF)
;~ Иными словами, всё это можно реализовать так:$hFile = FileOpen("test.txt", 0)
$aArray = StringSplit(StringRegExpReplace(FileRead($hFile),"\r\n|\r", @LF), @LF)
А сама функция должна выглядеть так:Func _FileReadToArray($sFilePath, ByRef $aArray)
;==============================================
; Local Constant/Variable Declaration Section
;==============================================
Local $hFile = FileOpen($sFilePath, 0)

If $hFile = -1 Then Return SetError(1)

$aArray = StringSplit(StringRegExpReplace(FileRead($hFile),"\r\n|\r", @LF), @LF)

FileClose($hFile)
Return 1
EndFunc ;==>_FileReadToArray
З.Ы. Сколько я не тестировал, всё время получается правильный массив. В чём моя ошибка? :(

Creat0R
22-06-2007, 02:17
Diamond
Иными словами, всё это можно реализовать так:
Да, но разве @CRLF это не одно и тоже что @CR & @LF? если одно и тоже, тогда зачем проверять ещё и @LF, можно только лишь @CR заменить на @LF, и делить на @LF (ведь в переменной останутся только @LF'ы)...

$aArray = StringSplit(StringReplace(FileRead($hFile), @CR, @LF), @LF)

На выходе имеется тот же массив...

Но у меня проблема не в этом, а как раз в содержимом массива...

всё время получается правильный массив
А вот у меня даже с таким примером:

#include <Array.au3>

Dim $Array

$TestFileHandle = FileOpen("Test.txt", 2)

FileWrite($TestFileHandle, @LF & "Line1" & @CR & "Line2" & @CR & "Line3" & @CR & "Line4" & @LF)

FileClose($TestFileHandle)

_FileReadToArray("Test.txt", $Array)

_ArrayDisplay($Array)

Func _FileReadToArray($sFilePath, ByRef $aArray)
;==============================================
; Local Constant/Variable Declaration Section
;==============================================
Local $hFile = FileOpen($sFilePath, 0)

If $hFile = -1 Then Return SetError(1)

$aArray = StringSplit(StringRegExpReplace(FileRead($hFile),"\r\n|\r", @LF), @LF)

FileClose($hFile)
Return 1
EndFunc

Почему то первый и последний элемент содержат символы перевода строки :idontnow: .

Diamond
22-06-2007, 02:38
Creat0R
Да, но разве @CRLF это не одно и тоже что @CR & @LF? если одно и тоже, тогда зачем проверять ещё и @LF, можно только лишь @CR заменить на @LF, и делить на @LF (ведь в переменной останутся только @LF'ы)...
Теперь у меня началось :wacko: - надеюсь это не заразно... :biggrin:
Почему то первый и последний элемент содержат символы перевода строки
Я посмотрел содержимое файла в редакторе "Bred" и... оказалось что полученный массив полностью соответствует текстовому файлу... 6 строк, первая и последняя пустые.
Всё верно! ;)




© OSzone.net 2001-2012