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

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

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

Старожил


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

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


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





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


Руководство к действию по работе 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

 

Аватара для kalikanzaros

Пользователь


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

Профиль | Отправить 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
Благодарности: 32

Профиль | Отправить 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


Аватара для Creat0R

Must AutoIt


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

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


Diamond_m
Цитата:
привязать функцию к основному циклу.
Это в каком то роде решает проблему, спасибо!

НО!, ах это "но"...

Проблема в том, что основной цикл не удобно использовать, у меня на кнопку старта, повешаны многие операции (функции, и статус бар ещё). Т.е запускается скрипт, нажимаем кнопку Старт, пускается по событию функция кнопки, в этой функции существует цикл, т.е в самом конце цикла происходит выход с него ExitLoop (обязательно), и мне нужно сделать так, чтобы в процессе выполнения всего этого цикла (показа статус бара, прогресс бара, выполнения разных функции и т.п), можно было нажать на кнопку "Аборт", и тогда должен происходить выход из цикла (не закрывая программу) - а точнее, должно выводиться сообщение с вопросом, мол хочет ли юзерь прервать операцию, и если ответить положительно, то выходим из цикла, если отрецательно, ничего не делаем, продолжаем с того же места на котором была нажата кнопка "Аборт" (тот же "Старт" переименованный)...

Нужно каким то образом, заставить вызвать событие (функцию) из самого цикла, преостановив этот самый цикл...

В приведённом тобой примере, функция которая вызывается по нажатию кнопки, как бы вызывается без прерывно, т.e постоянно начинается с начала, а мне нужно чтобы начало функции не происходило, при нажатии на "Аборт" просто приостанавливалось её (функции) выполнение.

Кстати, вот если не убирать иконку в трее, и оставить её функциональность по умолчанию, то при нажатии на неё появяется меню, там можно выбрать пункт Script Paused, и скрипт полностью преостанавливается - вот может можно как то точно также имитировать подобную паузу (вызвать функцию во время паузы)?

P.S
Надеюсь не запутался в объяснениях, просто уже голова пухнет от того что не могу никак сообразить, как решить эту, кажется простую задачку.

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

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

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


Отправлено: 00:06, 06-01-2007 | #103


Аватара для Creat0R

Must AutoIt


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

Профиль | Сайт | Отправить 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

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

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

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


Отправлено: 01:59, 06-01-2007 | #104


Пользователь


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

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


Creat0R
Цитата:
Нужно каким то образом, заставить вызвать событие (функцию) из самого цикла
Чтобы реализовать это, придётся отказаться от Opt("GuiOnEventMode", 1), тогда опрос событий GUIGetMsg() можно будет проводить непосредственно в твоём цикле. Другого выхода не вижу. Возможно это не удобно с точки зрения программиста но с точки зрения функциональности скрипта - вполне приемлемо.

Отправлено: 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


Аватара для Creat0R

Must AutoIt


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

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


Diamond_m
Цитата:
Чтобы реализовать это, придётся отказаться от Opt("GuiOnEventMode", 1), тогда опрос событий GUIGetMsg() можно будет проводить непосредственно в твоём цикле.
В принципе это даже очень подходит, просто отменяем проверку событии (Opt("GuiOnEventMode", 0)) перед началом цикла, а в начало цикла ставим $Msg = GuiGetMsg() - ну и потом всё что нужно обрабатываем на основе $Msg = $ID ... а в конце цикла просто включаем обратно обработку событии - вобщем, вроде проблема решена - спасибо.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:46, 06-01-2007 | #107


Пользователь


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

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


Creat0R
Цитата:
а в конце цикла просто включаем обратно обработку событии
Отлично придумал!!! Это позволит не переписывать большую часть скрипта заново, а также добавит ему гибкости.

Отправлено: 19:55, 06-01-2007 | #108


Аватара для Creat0R

Must AutoIt


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

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


RemoteAdmin
Цитата:
из конца файла отрезается маленький кусок
Это можно поправить убрав - 1 от общего числа массива (For $iaar = 1 To $aArray[0]), но тогда в конец файла всегда будет дописываться новая строка...

Могу предложить такой вариант на функцию замены текста в файле:

Код: Выделить весь код
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
Diamond_m
Цитата:
Отлично придумал!!!
Это благодаря твоим наводкам - спасибо ещё раз!

Отправлено: 23:32, 07-01-2007 | #109


Аватара для Creat0R

Must AutoIt


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

Профиль | Сайт | Отправить 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, то счётчик начинает показыать результаты в хаотичном порядке.

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

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

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


Отправлено: 06:05, 09-01-2007 | #110



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Открывая 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




 
Переход