Показать полную графическую версию : [Архив - Часть 1.3] AutoIt скрипты
Внимание!
Тема переведена в архивное состояние
[hr]Архивы старых тем по AutoIt (http://forum.oszone.net/forumdisplay.php?f=61&filter_string=%C0%F0%F5%E8%E2+-+%F7&filter_by=title) или они же в 7z архиве (версии для печати) - 846 кб (http://tools.oszone.net/Vadikan/forum_archives/autoit_threads_archive.7z)
(настоятельно рекомендуется к прочтению/поиску)
Руководство к действию по работе c AutoIt.
Помогите пожалуйста. Нужен маленький скриптик для решения некоторых рутинных задачь.
Вот что нужно сделать последовательно:
1) в папке DIR1 находим и удаляем файлы в названии которых присутствует text_1
2) в папке DIR2 находим xxx.sif и удаляем строки, в которых присутствует text_1
3) в папке DIR3 находим xxx.inf и добавляем в его секцию [XXX] несколько строчкек (text_2, text_3, ..., text_n)
4) в папке DIR4 находим yyy.inf ищем в его секции [YYY] text_4 и заменяем его на text_5
5) сохраняем все изменения и выводим отчёт о проделанной работе :-)
Заранее благодарен.
biork
п.п.1-4, точно в соответствии с формулировкой (см. примечания):#include <File.au3>
#include <Array.au3>
$DIR1 = 'C:\DIR1'
_FilesDelete ($DIR1, '*text_1*')
$DIR2 = 'C:\DIR2'
_FileLinesDelete ($DIR2 & '\' & 'xxx.sif', 'text_1')
$DIR3 = 'C:\DIR3'
Dim $Lines3 [3] = ['text_2', 'text_3', 'text_n']
_InfSectionAddLines ($DIR3 & '\' & 'xxx.inf', 'XXX', $Lines3)
$DIR4 = 'C:\DIR4'
_InfSectionReplaceText ($DIR4 & '\' & 'yyy.inf', 'YYY', 'text_4', 'text_5')
; Удаление файлов в заданном каталоге по маске.
; Возвращает количество удаленных файлов.
Func _FilesDelete ($sPath, $sFilter)
Local $aFiles, $i
$aFiles = _FileListToArray ($sPath, $sFilter, 1)
If IsArray ($aFiles) Then
For $i=1 To $aFiles [0]
FileDelete ($sPath & '\' & $aFiles [$i])
Next
Return $i-1
Else
Return 0
EndIf
EndFunc
; Удаление строк файла по условию вхождения заданного текста
; Возвращает: 1 - успех, 0 - ошибка. Коды ошибок:
; 1 - ошибка чтения файла;
; 2 - ошибка сохранения файла.
Func _FileLinesDelete ($sFilePath, $sEntry)
Local $aFileLines, $i
If _FileReadToArray ($sFilePath, $aFileLines) Then
For $i = $aFileLines [0] To 1 Step -1
If StringInStr ($aFileLines [$i], $sEntry) Then _ArrayDelete ($aFileLines, $i)
Next
If _FileWriteFromArray ($sFilePath, $aFileLines, 1) Then
Return 1
Else
SetError (2)
Return 0
EndIf
Else
SetError (1)
Return 0
EndIf
EndFunc
; Добавление заданного массива строк в секцию INF-файла
; Возвращает: 1 - успех, 0 - ошибка. Коды ошибок:
; 1 - переданный параметр не является массивом;
; 2 - выход за границы индекса;
; 3 - ошибка чтения файла;
; 4 - не найдена секция;
; 5 - ошибка сохранения файла.
Func _InfSectionAddLines ($sFilePath, $sSectionName, ByRef $aNewLines, $iStartIndex=0)
Local $aFileLines, $i
If Not IsArray ($aNewLines) Then
SetError (1)
Return 0
EndIf
If $iStartIndex >= UBound($aNewLines) Then
SetError (2)
Return 0
EndIf
If _FileReadToArray ($sFilePath, $aFileLines) Then
Local $iStart = _ArraySearch ($aFileLines, '[' & $sSectionName & ']', 1)
If $iStart = -1 Then
SetError (4)
Return 0
EndIf
For $i = UBound ($aNewLines)-1 To $iStartIndex Step -1
_ArrayInsert ($aFileLines, $iStart+1, $aNewLines [$i])
Next
If _FileWriteFromArray ($sFilePath, $aFileLines, 1) Then
Return 1
Else
SetError (5)
Return 0
EndIf
Else
SetError (3)
Return 0
EndIf
EndFunc
; Замена текста в пределах заданной секции INF-файла
; Возвращает: 1 - успех, 0 - ошибка. Коды ошибок:
; 1 - ошибка чтения файла;
; 2 - не найдена секция;
; 3 - ошибка сохранения файла.
Func _InfSectionReplaceText ($sFilePath, $sSectionName, $sTextFrom, $sTextTo)
Local $aFileLines, $i
If _FileReadToArray ($sFilePath, $aFileLines) Then
Local $iStart = _ArraySearch ($aFileLines, '[' & $sSectionName & ']', 1)
If $iStart = -1 Then
SetError (2)
Return 0
EndIf
Local $iFinal = _ArraySearch ($aFileLines, '[', $iStart +1)
If $iFinal = -1 Then $iFinal = $aFileLines [0]
If $iFinal > $iStart Then
For $i = $iStart+1 To $iFinal
$aFileLines [$i] = StringReplace ($aFileLines [$i], $sTextFrom, $sTextTo)
Next
If _FileWriteFromArray ($sFilePath, $aFileLines, 1) Then
Return 1
Else
SetError (3)
Return 0
EndIf
EndIf
Else
SetError (1)
Return 0
EndIf
EndFunc
З.Ы. несколько замечаний по формулировке задачи:
- INF-файл не просто текст, поэтому корректней говорить о переопределении параметров секции, а не "замене текста";
- соответственно, по п.4 возможно имелась ввиду замена строк целиком, а не вхождений текста;
- секции могут не отличаться от INI-файлов, в этом случае можно задействовать встроенные ф-ции AutoIT INI*.
Michail77
04-12-2006, 08:30
2Creat0R
Не совсем так,точнее совсем не так :)
Дать ссылку на картинку(системную,т.е на ту которая находится в системе по умолчанию,например в папке system32) это легко.
Мне надо чтобы картинка интегрировалась внутрь скрипта,с расположением которое ей указано и всегда была там,независимо от того есть такая картинка в системе или нет.
amel27
Большое спасибо.
Ошибочка выпадает (см. файл)
... и что такое? #include <File.au3>
#include <Array.au3>
biorkи что такое?Подключение дополнительных (пользовательских) функций, файлы расширений находятся в папке \Include установочного каталога. Так как файлы не загружены, то и функция (соответственно) неопознана.
amel27
С пользовательскими функциями разобрался. Пришлось, всего-лишь, переустановить AutoIt...
Что касаеися самого скрипта:
1) Удаление файлов в заданном каталоге по маске - работает!
1.2) Возвращает количество удаленных файлов - где и как посмотреть?
2) Удаление строк файла по условию вхождения заданного текста - работает!
2.1) Возвращает: 1 - успех, 0 - ошибка. Коды ошибок - так же не знаю где их увидеть.
3) Добавление заданного массива строк в секцию INF-файла - не работает...
3.1) Возвращает: 1 - успех, 0 - ошибка. Коды ошибок - очень хотелось бы их посмотреть...
4) Замена текста в пределах заданной секции INF-файла - не работает...
4.1) В чём ошибка - так же не видно...
Я понимаю, что всё от криворукости... но всё же? :-)
Ещё вопрос: строки text_2, text_3, text_n, а так же text_4 и text_5 содержат всякие знаки припинания (запятаи, кавычки, скобки и пр.). Может, нужно принимать какие то дополнительные меры, что бы всё это правильно было интерпритировано?
в 4 пункте, действительно можно бы было не менять текст, а изменить значение параметра.
А нет ли для AutoIt какой-нибудь рисовалки форм?
А то очень долго координаты с "дизайн-макета" списывать..
biorkВозвращает: 1 - успех, 0 - ошибка. Коды ошибок - очень хотелось бы их посмотретьПример с выводом результата на экран:; ...
$DIR3 = 'C:\DIR3'
Dim $Lines3 [3] = ['text_2', 'text_3', 'text_n']
$ret = _InfSectionAddLines ($DIR3 & '\' & 'xxx.inf', 'XXX', $Lines3)
If $ret Then
MsgBox (64, 'Собщение', 'Операция завершена без ошибок.')
Else
MsgBox (16, 'Ошибка', "Код ошибки: " & @error)
EndIf
; ...
YozheggА нет ли для AutoIt какой-нибудь рисовалки форм?
А то очень долго координаты с "дизайн-макета" списывать.. Думаю если бы был, то за него пришлось бы платить...
amel27
1 - переданный параметр не является массивом;
2 - выход за границы индекса;
3 - ошибка чтения файла;
4 - не найдена секция;
5 - ошибка сохранения файла.
Код ошибки - 0! :-)
biork
Извиняюсь, очепятку исправил...
amel27
Можно самому написать аналогичные функции
Приогромнейшее спасибо! и представить себе не мог что на аутоите это реально :)
В связи с этим есть вопрос:
Что в функции нужно поменять, чтобы вместо открытия фалов, был выбор каталога (FileSelectFolder), и также хотелось бы чтобы была функция сохранения файлов (FileSaveDialog) - Буду очень благодарен если поможешь с этими функциями...
И ещё (не принципиально) - при выборе файлов, возможно сделать массовый выбор? т.е чтобы можно было выбирать несколько файлов.
--------------------------------
По поводу самого гуи, я немогу понять одной вещи - чтобы создать гуи, необходимо построить цикл, но на сколько известно, безпрерывный цикл “заставляет” сильно загружать ЦП... т.е если мы сделаем такой цикл:
While 1
Wend
То загрузка ЦП будет 100% - Но если поставить задержку в этом цикле (Sleep(100)), то загрузки ЦП не будет. НО, в гуи ставить задержку нельзя, это портит функциональность нажатия кнопок и т.п.... но с другой стороны, даже если поставить подобную задержку в гуи, и при этом создать горячую клавишу (HotKeySet()), то по её вызову (по вызову её функции) всё нормально срабатывает... как сделать чтобы и функциональность сохранить (не используя клавиши), и предотвратить загрузку ЦП?
Просто дело в том, что хотел сворачивать скрипт в трей, затем в трее вывести меню, но если ставлю задержку в цикле скрипта (для трея), то пункты в трее не срабатывают, а если не ставить задержку, то процессор сильно грузится (бывает до 80-90%) - Как это решить?
Michail77
Мне надо чтобы картинка интегрировалась внутрь скрипта,с расположением которое ей указано и всегда была там,независимо от того есть такая картинка в системе или нет.
Для этого нужно установить файл в скрипте, чтобы перед запуском он расспаковывал изображение во временную папку, и затем считывал его оттуда (это при компилляции) - а вбить намертво изображение в скрипт, не получится.
Для установки файла исользуй такую команду:
FileInstall("Полный\путь\к\изображению\для\установки\image.png", "Путь\куда\будет расспаковано\изображение\image.png", 1)
А для использования просто указывай путь который ты прописал как назначения для помещения изображения...
GUICtrlCreatePic("Путь\куда\будет расспаковано\изображение\image.png",0,0, 300,40)
Creat0RПо поводу самого гуи, я немогу понять одной вещи - чтобы создать гуи, необходимо построить цикл,
Гуи не грузит проц, это даже в справке написано. Разве у тебя нет русской справки?
Насчет:
While 1
Sleep(100)
Wend
(применительно к другому случаю) сам бы хотел знать, какую оптимальную задержку выставлять.
YozheggА нет ли для AutoIt какой-нибудь рисовалки форм?
А то очень долго координаты с "дизайн-макета" списывать..
Здрасте, а как же koda designer?
Michail77
05-12-2006, 19:08
2 Creat0R
Спасибо,всё получилось :)))
All
В теме уже свыше 500 сообщений и поиск нужной информации в ней усложняется. Есть предложение собрать все решения (скрипты) и разместить их на Wiki (http://wiki.oszone.net) по принципу "один скрипт - одна статья wiki", добавляя статьи в категорию Autoit (http://wiki.oszone.net/index.php/Категория:AutoIt). Речь, в принципе, идет об общих решениях, а не о скриптах для установки конкретной программы. Название статьи, очевидно, должно отражать назначение скрипта. Затем можно в шапке просто разместить ссылки на статьи Wiki.
prokazzza
06-12-2006, 00:43
Sanja Alone
Слушай помнишь ты давал мне вот такой скрипт, я тут не нашел куда вставить имя rar архива и что будет если убрать из скрипта строчку ProcessWaitClose('INSTALL.exe') она мне не нужна.
If $CmdLine[0]=1 Then
$sfx=$CmdLine[1]
Else
MsgBox(16,'Ошибка',"Недопустимое содержимое командной строки",7)
Exit
EndIf
;пароль (берется из 3-й строки)
$password=FileReadLine(@ScriptDir&'\пароль.ini',3)
$pid=Run('"'&$sfx&'" -s')
WinWait('Ввод пароля')
ControlSetText('Ввод пароля','','Edit1',$password)
ControlClick('Ввод пароля','','Button1')
ProcessWaitClose($pid)
ProcessWaitClose('INSTALL.exe')
VadikanРечь, в принципе, идет об общих решениях, а не о скриптах для установки конкретной программыВот-вот.... С категориями путаница получается - я в смятении. Во-первых, есть две принципиально разных версии AutoIT (причем старая v.2.64 совместима по синтаксису с AutoHotKey) - в названии категории это не указано, хотя иконка недвусмысленно указывает на 3-ю версию. Во-вторых, на данный момент эта категория подчинена автоустановке, т.е. содержание ограничено скриптами, решающими те или иные Unattend-задачи хотя сфера применения AutoIT гораздо шире. В третьих, именование категорий по алфавиту может и оправдано в пределах темы (как в автоустановке), но необосновано и неудобно в общем случае - ИМХО требуется тематическое деление по категориям (тут нужно подумать).
Далее - где-то надо обсудить какие сабжи и в какой форме нужно выносить на WIKI, все-таки выдернуть скрипт из контекста обсуждения не так просто - придется приводить его к более универсальному виду, добавить комментарии, поработать с именами переменных.
З.Ы. Либо я еще не понял WIKI либо одно из двух, но без древовидной структуры от категорий мало толку.
amel27
Я извиняюсь, уже, наверное жутко надоел, но...
...скрипт ни как не может найти секцию...
может с синтаксисом чего?
$ret = _InfSectionAddLines ($DIR1 & '\' & 'HIVESYS.INF', 'AddReg', $Lines)
$ret = _InfSectionReplaceText ($DIR1 & '\' & 'HIVESFT.INF', 'Strings', $text_4, $text_5)
Creat0RЧто в функции нужно поменять, чтобы вместо открытия фалов, был выбор каталога (FileSelectFolder), и также хотелось бы чтобы была функция сохранения файлов (FileSaveDialog) - Буду очень благодарен если поможешь с этими функциями...Вполне реально, но быстро не получится - соответствующие API-аналоги посложней будут...
безпрерывный цикл “заставляет” сильно загружать ЦПДля этого в AutoIT есть метод "OnEvent" - альтернатива методу "MessageLoop". Смотри пример в HELP к GUICtrlSetOnEvent .
biork
файл и путь в личку
prokazzza
06-12-2006, 15:40
amel27
Можешь доделать вот такой скрипт, я тут не нашел куда вставить имя rar архива и что будет если убрать из скрипта строчку ProcessWaitClose('INSTALL.exe') она мне не нужна.
If $CmdLine[0]=1 Then
$sfx=$CmdLine[1]
Else
MsgBox(16,'Ошибка',"Недопустимое содержимое командной строки",7)
Exit
EndIf
;пароль (берется из 3-й строки)
$password=FileReadLine(@ScriptDir&'\пароль.ini',3)
$pid=Run('"'&$sfx&'" -s')
WinWait('Ввод пароля')
ControlSetText('Ввод пароля','','Edit1',$password)
ControlClick('Ввод пароля','','Button1')
ProcessWaitClose($pid)
ProcessWaitClose('INSTALL.exe')
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.