|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 1.3] AutoIt скрипты |
|
[Архив - Часть 1.3] AutoIt скрипты
|
Старожил Сообщения: 250 |
Профиль | Отправить PM | Цитировать
Внимание! Тема переведена в архивное состояние (настоятельно рекомендуется к прочтению/поиску) Руководство к действию по работе 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) сохраняем все изменения и выводим отчёт о проделанной работе :-) Заранее благодарен. |
|
Отправлено: 05:05, 03-12-2006 |
Пользователь Сообщения: 65
|
Профиль | Отправить PM | Цитировать есть ли у кого нибудь красивое решение установки alcohol120 а потом сразу lingvo11?
так как пока что у меня все это выглядит достаточно сложно и некрасиво... запускаю autoit скрипты из wpi 5.6, который в свое очередь стартует из RunOnceEx.cmd который стартует с CD... надеюсь про запуск строчка будет понятна вот как сейчас это работает у меня: скрипт alcohol120 отрабатывает, а потом команда %reboot%, wpi перезагружает комп, я наивный думал что потом продолжится установка alcohol120, и только затем стартанет lingvo11, но нет, wpi запускается раньше и не дает закончить установку.... конечно можно сделать в 3 строки, что-то типа: alcoho120.exe (без добавления в автозагрузку скрипта после перезагрузки) %reboot% alchol120.exe (скрипт закончит установку) и потом начнется установка lingvo11, скрипт lingvo11 первым делом запустит установленный alcohol и даст ему секунд 5-10 для создания виртуального CD, после чего alcohol будет закрыт, а установка lingvo11 продолжена... но мне кажется есть решение проще и красивее, нет ни у кого идей? |
------- Отправлено: 16:03, 05-01-2007 | #101 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 135
|
Профиль | Отправить PM | Цитировать Creat0R
Ты наверное заметил что во время работы цикла также недоступна обработка системного события (т.е. Выход из GUI). Я думаю, единственный путь привязать функцию к основному циклу. Может кто-то считает по другому? Opt("GuiOnEventMode", 1) #include <GUIConstants.au3> Global $StartProgress=0, $i=0 $gui = GUICreate("Abort GUI", 420, 140, -1, -1, $WS_SIZEBOX) $Button = GUICtrlCreateButton("Start", 180, 20, 70) GUICtrlSetOnEvent($Button, "SetExitLoop") GUISetOnEvent(-3, "ExitScript") $Progress = GUICtrlCreateProgress(60, 60, 300, 15) GUISetState(@SW_SHOW) While 1 Sleep(10) If $StartProgress = 1 Then Button() EndIf WEnd Func Button() $i=$i+1 If $i=101 Then $i=0 EndIf GUICtrlSetData($Progress, $i) EndFunc Func SetExitLoop() If $StartProgress=1 Then $StartProgress = 0 GUICtrlSetData($Button, "Start") Else $StartProgress = 1 GUICtrlSetData($Button, "Abort") EndIf EndFunc Func ExitScript() Exit EndFunc |
Отправлено: 17:24, 05-01-2007 | #102 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Diamond_m
Цитата:
НО!, ах это "но"... Проблема в том, что основной цикл не удобно использовать, у меня на кнопку старта, повешаны многие операции (функции, и статус бар ещё). Т.е запускается скрипт, нажимаем кнопку Старт, пускается по событию функция кнопки, в этой функции существует цикл, т.е в самом конце цикла происходит выход с него ExitLoop (обязательно), и мне нужно сделать так, чтобы в процессе выполнения всего этого цикла (показа статус бара, прогресс бара, выполнения разных функции и т.п), можно было нажать на кнопку "Аборт", и тогда должен происходить выход из цикла (не закрывая программу) - а точнее, должно выводиться сообщение с вопросом, мол хочет ли юзерь прервать операцию, и если ответить положительно, то выходим из цикла, если отрецательно, ничего не делаем, продолжаем с того же места на котором была нажата кнопка "Аборт" (тот же "Старт" переименованный)... Нужно каким то образом, заставить вызвать событие (функцию) из самого цикла, преостановив этот самый цикл... В приведённом тобой примере, функция которая вызывается по нажатию кнопки, как бы вызывается без прерывно, т.e постоянно начинается с начала, а мне нужно чтобы начало функции не происходило, при нажатии на "Аборт" просто приостанавливалось её (функции) выполнение. Кстати, вот если не убирать иконку в трее, и оставить её функциональность по умолчанию, то при нажатии на неё появяется меню, там можно выбрать пункт Script Paused, и скрипт полностью преостанавливается - вот может можно как то точно также имитировать подобную паузу (вызвать функцию во время паузы)? P.S Надеюсь не запутался в объяснениях, просто уже голова пухнет от того что не могу никак сообразить, как решить эту, кажется простую задачку. |
|
------- Отправлено: 00:06, 06-01-2007 | #103 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать ВО! такой вариант работает по нажатию на горячую клавишу (Ctrl S), почему же событие не срабатывает при нажатии на кнопку?
Opt("GuiOnEventMode", 1) #include <GUIConstants.au3> HotKeySet("^s", "SetExitLoop") Global $ExitLoop, $Mark = 10 $gui = GUICreate("Abort GUI", 420, 140, -1, -1, $WS_SIZEBOX) $Button = GUICtrlCreateButton("Start", 180, 20, 70) GUICtrlSetOnEvent($Button, "Button") GUISetOnEvent(-3, "ExitScript") $Progress = GUICtrlCreateProgress(60, 60, 300, 15) GUISetState(@SW_SHOW) While 1 Sleep(100) WEnd Func Button() GUICtrlSetData($Button, "Abort") While $ExitLoop = 0 For $i = $Mark To 100 If $i = 100 Then $i = 0 GUICtrlSetData($Progress, $i) If $ExitLoop = 1 Then $Mark = $i ExitLoop EndIf Sleep(10) Next WEnd GUICtrlSetData($Button, "Start") $ExitLoop = 0 EndFunc Func SetExitLoop() $ExitLoop = 1 EndFunc Func ExitScript() Exit EndFunc |
------- Отправлено: 01:59, 06-01-2007 | #104 |
Пользователь Сообщения: 135
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
|
|
Отправлено: 04:21, 06-01-2007 | #105 |
RemoteAdmin
Сообщения: n/a |
Всем привет! Помогите новичку.
Вообщем возникла такая проблема. Мне нужно заменить один текст внутри exe файла, на свой. Ну например, текст: This program cannot be run in DOS mode Заменить на текст: <----------------AutoIT RuleZ----------------> Я пытался использовать вот эту функцию: Func ReplaceText($FileNameT, $OldText, $NewText) $hFile = FileOpen($FileNameT, 0) $aArray = StringSplit(FileRead($hFile, FileGetSize($FileNameT)), @LF) If Not @error Then FileClose($hFile) $hFilew = FileOpen($FileNameT, 2) For $iaar = 1 To $aArray[0] - 1 $ReplStrT = StringReplace($aArray[$iaar], $OldText, $NewText) FileWrite($hFilew, $ReplStrT & @LF) Next FileClose($hFilew) EndIf EndFunc Я также пытался, передавать ему не простые строки текста, но и в HEX, Binary формате (BinaryString), всё равно не может ничё сделать. На офф, форумах AutoIT нашёл функции BinaryWrite/BinaryRead, но так и не смог в них разобратся. Не могли бы вы помочь мне, в реализации моей затеи, желательно с примерами. Спасибо. |
Последний раз редактировалось Sanja Alone, 09-01-2007 в 22:01. Причина: Добавление тэга code Отправлено: 13:16, 06-01-2007 | #106 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Diamond_m
Цитата:
|
|
Отправлено: 16:46, 06-01-2007 | #107 |
Пользователь Сообщения: 135
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
|
|
Отправлено: 19:55, 06-01-2007 | #108 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать RemoteAdmin
Цитата:
Могу предложить такой вариант на функцию замены текста в файле: Func ReplaceText($FileName, $OldText, $NewText) If $OldText <> "" Then $hFile = FileOpen($FileName, 0) $VarToWrite = FileRead($hFile, FileGetSize($FileName)) $ReplStr = StringReplace($VarToWrite, $OldText, $NewText) FileClose($hFile) $hFilew = FileOpen($FileName, 2) FileWrite($hFilew, $ReplStr) FileClose($hFilew) EndIf EndFunc Цитата:
|
||
Отправлено: 23:32, 07-01-2007 | #109 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Написал две примитивные функции - Одна предназначена для не совсем точного подсчёта скорости закачки (по InetGet), а друга на основе этой скорости закачки высчитывает сколько времени осталось до окончания (в секундах)...
НО! я полагаю что есть более точное решение этой задумке, ведь по идее, должны учитываться не просто полученные данные в интервале одной секунды, а ещё и скорость модема, скорость отдачи на сервере и т.п... вот как бы всё это расчитать, и построить точную функцию для подсчёта скорости закачки и оставшееся время до окончания? Вот эти две функции и пример их применения: ;Заносим в переменную $URL ссылку на закачку. $URL = "http://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3.2.2.0-setup.exe" ;Берём из ссылки только имя файла. $FileName = StringRegExpReplace($URL, "^.*/", "") ;Ставим ссылку на закачку в фоновом режиме. InetGet($URL, "C:\" & $FileName, 1, 1) ;Получаем общий размер файла по ссылке (в байтах). $InetGetSize = InetGetSize($URL) ;Пока файл закачивается, проверяем размер, оставшееся время, и выводим в трее результаты. While @InetGetActive $BytesCheckBefore = @InetGetBytesRead Sleep(1000) $BytesCheckAfter = @InetGetBytesRead $SpeedByBytes = _InetGetSpeed($BytesCheckAfter, $BytesCheckBefore) TrayTip("Download", "Approximately Remained Time (seconds): " & Round(_InetGetRemained(@InetGetBytesRead, $InetGetSize, $SpeedByBytes)), 0, 1) WEnd ;Функция возвращает скорость скачивания на основе полученных данных (до, и после секунды) - возвращаются байты в секунду (b/s). Func _InetGetSpeed($BytesCheckAfter, $BytesCheckBefore) $RetSpeedByBytes = $BytesCheckAfter - $BytesCheckBefore If $RetSpeedByBytes < 0 Then Return 0 Return $RetSpeedByBytes EndFunc ;Функция возвращает оставшееся время в секундах (за счёт вычесления из общего размера файла и деления на скорость скачивания). Func _InetGetRemained($Bytes, $TotalBytesSize, $SpeedByBytes) $RemainedBytes = $TotalBytesSize - $Bytes If $RemainedBytes <= 0 Then Return 0 Return $RemainedBytes / $SpeedByBytes EndFunc P.S. Если файл около 2-ух 3-ёх MB, то функции подсчитывают довольно точно, но если речь идёт уже о 5-ти и более MB, то счётчик начинает показыать результаты в хаотичном порядке. |
------- Отправлено: 06:05, 09-01-2007 | #110 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Открывая 7z архив пишет не удаётся открыть как архив. Можно ли его восстановить? | DreDo | Хочу все знать | 4 | 01-12-2009 18:54 | |
[Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:. | Vadikan | AutoIt | 1543 | 18-01-2009 10:46 | |
[архив - Часть 2] AutoIt скрипты | Vadikan | AutoIt | 985 | 21-01-2008 09:58 | |
[Архив - Часть 1.2] AutoIt скрипты | Dirk Diggler | AutoIt | 505 | 02-12-2006 11:00 | |
[Архив - Часть 1.1] AutoIt скрипты | EgOrus | AutoIt | 335 | 04-02-2006 16:58 |
|