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

Компьютерный форум 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

 

Аватара для Creat0R

Must AutoIt


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

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


Diamond
А функция не работает то - нужно Global $GetPath = 0 ставить вне функции, т.к каждый вызов подфункции, вне зависимости от того найден ли файл, задаёт переменной $GetPath значение 0, таким образом цикл не прирывается, и пока не проверяются все файлы функция действует...

Вот немного изменил её (сорри если что), а также добавил в неё определение файла в корневом каталоге (в $Path):

Код: Выделить весь код
Global $GetPath=0
$ret = find(@ProgramFilesDir,"qip.exe")
If Not $ret=0 Then
	MsgBox(0,"",$ret)
	; Записываем значение $ret в реестр...
Else
	MsgBox(0,"","Файл не найден.")
EndIf

;=================================

; $Path - Путь поиска. ( Не должен заканчиваться слэшем!!! )
; $FileName - Имя искомого файла.
; Возвращает полный путь к каталогу (не к файлу), если файл осутствует возвращает 0

Func find($Path,$FileName)
$ModPath=$Path & "\*" ; Формирую строку поиска (толко для инициализации)
$file=FileFindFirstFile($ModPath) ; Инициализация поиска
While 1
; Условие для прерывания всех циклов - чтобы быстро выйти из функции
	If $GetPath <> 0 Then ; Если нужный нам файл уже найден тогда
		ExitLoop ; Прерываю циклы всех подфункций
	EndIf
	$get=FileFindNextFile($file) ; Поиск...
	If @error Then ExitLoop
	$string=$Path & "\" & $get ; Формирую новый путь
	If Not StringInStr(FileGetAttrib($string),"D") Then ;Если не является папкой тогда:
		If $get=$FileName Then
			$GetPath=$Path
			ExitLoop
		EndIf
	Else
		find($string,$FileName) ; Запуск подфункции для поиска в подпапке
	EndIf
WEnd
FileClose($file) ;Завершение инициализации
Return $GetPath
EndFunc
Файл в корневом каталоге и раньше определялся (если убрать Global $GetPath = 0 из функции), но так быстрее
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


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



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Creat0R

Must AutoIt


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

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


Diamond
Немного “гуинизировал” твою функцию для поиска файла - в первом поле задаём путь в котором нужно искать, а в нижнем запрос (имя файла) - неверно набранный путь (если не существует или содержит слеш на конце) определяется, а также определяется если набранное имя файла содержит непозволенные символы (< > | ? : * / \ "):

Код: Выделить весь код
Opt("GuiOnEventMode", 1)

Global $Progress = 0.1, $GetPath = 0
$PathForSearch = @ProgramFilesDir
$FileToFind = "FileName.exe"

$Gui = GUICreate("File Finder", 300, 170, -1, -1, -1, 0x00000088)
GUISetOnEvent(-3, "ExitScript")

GUICtrlCreateLabel("Path to search on:", 20, 30)
$PathInput = GUICtrlCreateInput($PathForSearch, 20, 50, 270)

GUICtrlCreateLabel("File to find:", 20, 90)
$FileNameInput = GUICtrlCreateInput($FileToFind, 20, 110, 270)

$SearchButton = GUICtrlCreateButton("Search", 70, 140, 60, 20)
GUICtrlSetOnEvent(-1, "SearchButton")
$CancelButton = GUICtrlCreateButton("Cancel", 180, 140, 60, 20)
GUICtrlSetOnEvent(-1, "ExitScript")

GUISetState()

While 1
    Sleep(100)
WEnd

Func _FindFile($Path, $FileName)
    $ModPath = $Path & "\*" ; Формирую строку поиска (толко для инициализации)
    $File = FileFindFirstFile($ModPath) ; Инициализация поиска
    While 1
        ; Условие для прерывания всех циклов - чтобы быстро выйти из функции
        If $GetPath <> 0 Then ExitLoop ; Прерываю циклы всех подфункций
        $Get = FileFindNextFile($File)
        If @error Then ExitLoop
        $String = $Path & "\" & $Get ; Формирую новый путь
        ProgressSet($Progress, $Path & @CR & $Get)
        $Progress = $Progress + 0.1
        If $Progress >= 100 Then $Progress = 0.1
        If Not StringInStr(FileGetAttrib($String), "D") Then ;Если не является папкой тогда:
            If $Get = $FileName Then
                $GetPath = $Path
                ExitLoop
            EndIf
        Else
            _FindFile($String, $FileName) ; Запуск подфункции для поиска в подпапке
        EndIf
    WEnd
    FileClose($File) ;Завершение инициализации
    Return $GetPath
EndFunc

Func SearchButton()
    If Not FileExists(GUICtrlRead($PathInput)) Then
        _MsgBox(16, "Error", "You must type an existing path", $Gui)
    ElseIf StringRight(GUICtrlRead($PathInput), 1) = "\" Then
        _MsgBox(48, "Attention!", "The path must not have a slash (\) at the end of it.", $Gui)
    ElseIf GUICtrlRead($FileNameInput) = "" Then
        _MsgBox(16, "Error", "You must type a file name", $Gui)
    ElseIf Not _IsFileName(GUICtrlRead($FileNameInput)) Then
        _MsgBox(16, 'Error', 'The file name include an invalid characters' & @CR & '< > | ? : * / \ "', $Gui)
    Else
        $PathForSearch = GUICtrlRead($PathInput)
        $FileToFind = GUICtrlRead($FileNameInput)
        GUISetState(@SW_HIDE, $Gui)
        ProgressOn("Please wait...", "Search is in progress...", $PathForSearch, -1, -1, 16)
        $SearchResults = _FindFile($PathForSearch, $FileToFind)
        ProgressOff()
        If Not $SearchResults = 0 Then
            MsgBox(262144+64, "Done!", "File <" & $FileToFind & "> was found in this path <" & $SearchResults & ">.")
        Else
            MsgBox(262144+48, "Attention!", "File <" & $FileToFind & "> was not found on <" & $PathForSearch & "> and it subfolders." & @CR & @CR & "OK ---> EXIT")
        EndIf
        GUISetState(@SW_SHOW, $Gui)
    EndIf
EndFunc

Func _IsFileName($Test)
    If StringRegExp($Test, '[<>|?:"*/\\]') <> 0 Then
        Return False
    Else
        Return True
    EndIf
EndFunc

Func _MsgBox ($MsgBoxType, $MsgBoxTitle, $MsgBoxText, $mainGUI=0)
    $ret = DllCall ("user32.dll", "int", "MessageBox", _
            "hwnd", $mainGUI, _
            "str", $MsgBoxText , _
            "str", $MsgBoxTitle, _
            "int", $MsgBoxType)
    Return $ret [0]
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


Отправлено: 08:44, 23-01-2007 | #162


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


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

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


Creat0R
Цитата:
Такого конкретного стиля (кажется) нет
Вот и я так подумал что в самом AutoIt классического стиля нет. Мне кажется, что это сама система навязывает свой стиль(Windows XP). Т.е. это как например если не указать конкретно цвет фона для GUI, то цвет фона по умолчанию становится системный(BtnFace). Вот если бы это дело можно было как-то "блокировать", думаю нужно копать в сторону WinApi.
Цитата:
тогда можно перетаскивать окно тягая этот контроль:
Отлично! Что-то вроде этого я как раз и искал. Спасибо! Жалко только что GuiCtrlCreateLabel перекрывает мои кнопки.
Цитата:
твой, ровно в два раза быстрее!
Я считаю что мой скрипт значительно уступает твоему по функциональности.
Цитата:
цикл не прирывается, и пока не проверяются все файлы функция действует
Да действительно... я добавил Global $GetPath=0 в самый последний момент, и видимо как следует не протестировал, а до того у меня стоял Global $GetPath без всяких нулей - соответственно, при отсутствии файла возвращалось пусто (""). В принципе, $GetPath можно оставить и внутри функции (только не приравнивать нулю или, проверять переменную на декларирование), а на скорости я думаю это сильно не отразится. Кстати протестировал на скорость у меня разница где-то 1,5 раза. Спасибо что указал на ошибку!
А вот ExitLoop что ты добавил, никак не влияет на прерывание!

Отправлено: 09:30, 23-01-2007 | #163


Аватара для Creat0R

Must AutoIt


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

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


Diamond
Цитата:
ExitLoop что ты добавил, никак не влияет на прерывание!
Создай в C:\program files файл test.txt, и задай вместо qip.exe - test.txt, теперь запусти функцию без ExitLoop (засеки время поиска), и запусти с ExitLoop, файл найден почти сразу же

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

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

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


Отправлено: 10:27, 23-01-2007 | #164


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


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

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


Creat0R
Цитата:
запусти функцию без ExitLoop (засеки время поиска), и запусти с ExitLoop, файл найден почти сразу же
Твой способ проверки (сравнение по времени) оказался не стабилен. Я долго гонялскрипт и, во многих случаях получалось как раз то всё наоборот. Но я решил подставлять Msgbox() в разных места и при различных вариантах. Получается что ты прав! И даже больше!!! :UP:

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

Отправлено: 02:45, 24-01-2007 | #165


Аватара для Creat0R

Must AutoIt


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

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


Нашёл в аутоите баг (или это так задуманно?) - При BlockInput(1), вроде всё кроме Ctrl Alt Del должно быть заблокированно, но срабатывает нажатие и на Sleep и на Power.
Собственно вопрос: Возможно ли перед блокировкой, назначить другое действие для этих клавиш? (т.е чтобы при их нажатии ничего не происходило) - Очень очень нужно .

P.S
Задать клавишу Sleep можно, но она почему то продолжает работать (как Sleep)

Последний раз редактировалось Creat0R, 24-01-2007 в 21:55.


Отправлено: 17:36, 24-01-2007 | #166


Аватара для Creat0R

Must AutoIt


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

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


Давно искал способ сделать “плавающее окошко”, чтобы ещё при “плавании” , перемещалось хаотично по экрану. Когда ещё только начинал разбирать гуи в AutoIt'е, думал это не реально, и забросил эту затею, но вот тут ни с того ни с сего, я вдруг вспомнил об этом, и решил попробовать реализовать (всё же знании уже побольше), и, реализовал! (довольно без проблем, и быстро)...

Вот Пример:

Код: Выделить весь код
#include <GuiConstants.au3>
Opt("GuiOnEventMode", 1)

;Создаём стильны гуи для показа ;-)
GUICreate("Fading GUI", 200, 100, -1, -1, $WS_POPUP+$WS_DLGFRAME, $WS_EX_CLIENTEDGE+$WS_EX_TOPMOST)
GUISetOnEvent(-3, "ExitScript")
GUISetBkColor(0xC1C9FD)
;Активируем гуи в скрытом режиме, в целях избежания мерцания окна при первом запуске
GUISetState(@SW_HIDE)
;Устанавливаем самый высокий уровень (0) прозрачности окна гуи
WinSetTrans("Fading GUI", "", 0)
;Показываем обратно гуи в невидемом состоянии (100 % прозрачности)
GUISetState(@SW_SHOW)

$Close = GUICtrlCreateButton("Close", 70, 40, 60, 20)
GUICtrlSetOnEvent(-1, "ExitScript")

;Включаем функцию утухания и перемещения окна каждые 100 м"с
AdlibEnable("GUIFad", 100)
While 1
    Sleep(10)
WEnd

Func GUIFad()
    ;Задаём интервал исчезновения окна и проходимся по нему
    For $i = 0 To 255
        Sleep(10)
        WinSetTrans("Fading GUI", "", $i)
    Next
    Sleep(50)
    ;Задаём интервал появления окна и проходимся по нему (в обратном порядке)
    For $j = 255 To 0 Step -1
        Sleep(10)
        WinSetTrans("Fading GUI", "", $j)
    Next
    ;Двигаем окно в хаотичном порядке (хм, парадокс получается ;) ), в соответствии с координатами разрешения экрана
    WinMove("Fading GUI", "", Random(0, @DesktopWidth-200), Random(0, @DesktopHeight-200))
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


Отправлено: 21:47, 24-01-2007 | #167


Аватара для Creat0R

Must AutoIt


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

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


Оказывается, можно вызвать MsgBox не в стильном виде (не испоьзуя стиль WinXP) - т.е сообщение будет выглядеть как системное в Win98...

Нужно просто перед основным флагом, ставить стиль 0x20000:

Код: Выделить весь код
MsgBox(0x20000+64, "Hello!", "I am styleless MsgBox ;) ")
Я вот только не знаю как убрать атрибут “поверх всех окон”, перепробовал кучу номеров, но так и не нашёл подходящий.

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

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

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


Последний раз редактировалось Creat0R, 26-01-2007 в 06:17.


Отправлено: 03:48, 26-01-2007 | #168


Аватара для borzoy

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


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

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


Привет всем!!!
Помогите пожалуйста с скриптом для установкой Fraps и Runpad Shell.
Для тихой установки уже наверное все ключики перепробЫвал, но не помогает, всеравно вылазиет табличка с уведомлением установить программу.

Отправлено: 01:32, 27-01-2007 | #169


Аватара для Creat0R

Must AutoIt


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

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


borzoy
Цитата:
Для тихой установки уже наверное все ключики перепробЫвал
Эта инфа, я полагаю должна сопоставляться с установщиком...
А вообще, нужно было создавать отдельный топик:

Цитата:
Данная тема предназначена для общих вопросов по AutoIt. Вопросы по установке приложений при помощи AutoIt следует задавать в соответствии с правилами форума "Автоматическая установка приложений". Таким образом, если вы хотите узнать как установить Winamp 5.x при помощи AutoIt, то создайте тему [autoit] Winamp 5.х (если таковой еще нет на форуме). Проверить наличие тем можно при помощи поиска или фильтров.

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

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

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


Отправлено: 10:28, 27-01-2007 | #170



Компьютерный форум 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




 
Переход