Показать полную графическую версию : [архив - Часть 2] AutoIt скрипты
Creat0R
Ну почему, в массив то попадают все строки с нужным текстом, а зачем в массиве символы перевода строки и возврата каретки?
Ни один из символов перевода строки, в массив не попадают. (у меня)
И кстати, при чтении всего файла, совсем не обязательно использовать FileGetSize()
Енто вопрос не ко мне а, к автору функции: _FileReadToArray() ;) - раз уж он так зделал, то и я вслед за ним не стал это исправлять.
А разве в этом примере символы перевода строки и возврата каретки не заменятся на символ новой строки? может при делении на массив нужно использовать @LF а не @CR?
А, какая разница?
На всякий случай поясню:
Допустим в одном файле могут встретится 3 различных типа завершения строки, с помощью StringRegExpReplace() я последовательно меняю все @CRLF на @CR, затем @LF на @CR, в конечном счёте в тексте остаётся только @CR который я использую в качестве разделителя.
Но можно использовать и @LF - не вижу разницы...$aArray = StringSplit(StringRegExpReplace(FileRead($hFile),"\r\n|\r",@LF),@LF)
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)
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
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
Хм.. надо бы её автору маякнуть об этом.... а ещё лучше, сразу в баг репорт запостить на оф. форум, привести пример что эта функция может возвращать не корректные данные...
Но всё же остаётся одна проблема - если в файле содержатся промежуточные символы перевода строки (@LF), то гинерируется пустой элемент массива...
Получается это ошибка функции StringSplit() ?
Diamondчтобы произвести добавление, удаление или замену элементов, массивы используют UDF-функцииХм... Добавление в конец массива можно сделать через ReDim(), вставку в середину массива без UDF не осуществить в обоих случаях.... Физическое удаление элементов массива проводить не обязательно - достаточно "пометить" их и не использовать при обработке.... по замене не понял - это же обычное присвоение.
Diamond, Creat0R ...по поводу _FileReadToArray():
- у StringSplit() есть флаг, позволяющий использовать более одного символа для разбиения:$a = StringSplit ($text, @CRLF, 1)- уж коли зашла речь про StringRegExp(), то она вполне самодостаточна:$a = StringRegExp ($text, '(?m)^(.*)$', 3)Creat0Rоно вообще реализуемо?ИМХО в общем виде - нет, иначе можно было бы без проблем подчинить себе любое окно, скажем тот же IE... Видимая "подчиненность" отражает классовую сущность окон, поэтому они должны быть как минимум в одном процессе... В случае с MsgBox() код расшарен через DLL и запускается в текущем потоке, поэтому подчинение реализуемо.
eNcub
Цитата:Если это окно не появляется, то нажатие стрелки вверх и энтера всё равно производится
Попробуй так:
Код:
WinWaitActive('Мастер новых подключений', 'Выберите, надо ли автоматически подключаться к Интернету', 5)
If WinActive('Мастер новых подключений', 'Выберите, надо ли автоматически подключаться к Интернету') Then Send('{UP}{ENTER}')
:(... попробовал, ничего не изменилось...
еще мысли есть у кого-нибудь? плз..
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
если я правильно понял цель написания скрипта, то проще использовать твик реестра :)
XXXler
таак, а что с реестром? этот вариант тоже не прошел...
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 в заголовке скрипта...
amel27
у StringSplit() есть флаг, позволяющий использовать более одного символа для разбиения:
Я его пробовал, в этом случае он всё ровно добавляет в массив пустую строку...
уж коли зашла речь про StringRegExp(), то она вполне самодостаточна:
Этот пример должен возвращать массив с подделенными строками на @LF? возвращается массив с одним пустым, и при чём нудевым элементом :idontnow:
schel4ok
Я сразу не понял что речь идёт об установке файла, а не его запуске (это ведь требуется?)...
Для установки действительно будет полезна функция предложенная amel27 чуть выше, сам нечто подобным пользуюсь для установки Inf файлов (правда из батника ;) ).
Помогите, пожалуйста, разобраться:
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 <<<<
ОК
Проверьте правильность введенного серийного номера.
Окно не закрывается и все идет по кругу, т.е. генерация и серийника и появление еще одного окна
Diamond, спасибо за подсказки, это очень интересно.
Сейчас считываю весь файл в gui List и от него "играю",
но как варинат с текстом в масиве.....может пригодится.
Creat0R - спасибо за пример, Diamond пару постов выше
уже показал твой пример. Я сейчас изменел первичный замысел
и сейчас не требуется замена тсрок, но на вооружение взял.
И ещё, скромный вопрос, auto IT это замечательно, но создовать
уж созданное думаю нет серьезного смысла.....может знакомы
с языком С++ , VB, ..... что лучше применить к изучению для
написания подобных приложений?
п.с.: я не сравниваю аутоИТ и другие языки, я хочу понять
какой, в целом, язык оптимальние и приняться к его изучению.
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++ и будет оптимальным языком программирования (это конечно, очень и очень Имхо ;)).
Creat0R
Совсем я запутался.
Если не трудно, укажите куда конкретно в моем примере нужно вставить проверку.
gvshil
куда конкретно в моем примере нужно вставить проверку.
Вместо всех функции проверки на существование окна (WinExists()). А саму функцию _WinIsVisible в конец файла.
Dirk Diggler
22-06-2007, 01:00
Написал скрипт для архивирования.
если кому надо, поюзайте, расскажете, как оно....
вот, из ридмишки.
1. ВВЕДЕНИЕ
Когда-то я пользовался nnBackup. Но ограничение в 2Гб на архив меня убивало. И убивает посейчас. Кроме того, nnBackup, как и многие архиваторы, использующиеся для резервного копирования, не умеют архивировать открытые другими программами файлы(дружно вспомним базы 1С).
И вот, я решил устранить эти недостатки. Эти устранил. вроде бы. А вот чего этот скрипт не умеет, см. в самом конце.
2. ОПИСАНИЕ
Данный скрипт представляет собой "оболочку" для архиватора 7-zip(www.7-zip.org) начиная с версии 7.47.
Основное назначение - резервное архивирование данных.
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
З.Ы. Сколько я не тестировал, всё время получается правильный массив. В чём моя ошибка? :(
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: .
Creat0R
Да, но разве @CRLF это не одно и тоже что @CR & @LF? если одно и тоже, тогда зачем проверять ещё и @LF, можно только лишь @CR заменить на @LF, и делить на @LF (ведь в переменной останутся только @LF'ы)...
Теперь у меня началось :wacko: - надеюсь это не заразно... :biggrin:
Почему то первый и последний элемент содержат символы перевода строки
Я посмотрел содержимое файла в редакторе "Bred" и... оказалось что полученный массив полностью соответствует текстовому файлу... 6 строк, первая и последняя пустые.
Всё верно! ;)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.