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

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

Цитата:
Рукописная функция _FileOpenDialog у меня возвращает цифры 0x433A5C446F63756D... и т.п. и очень много нулей.
Странно, amel27, что скажешь, от чего это может быть вызвано?

Цитата:
А в отдельном скрипте сам объект не пробовал тестировать?
Не пробовал, но как выяснилось, это вызвано тем, что самопальная функция возвращает символы перевода строки на конце переменной выбранных файлов. При передаче подобной переменной в проверку словаря, действие проваливается.

gregaz
Цитата:
Почему даный пример работает даже без обьявления #include <GUIConstants.au3> ?
Паотому что нет констант из этого вложения используемых примером

Цитата:
Правильно ли я понял ,что обявление Global переменных нужно только лишь для Обьявления
начальных значений еще не созданных элементов ( можно наверное и так : $Input1 ="" и т.д.) ?
Совершенно правильно. Если переменные создавать вне функции/циклов (в начале скрипта), то особой необходимости в глобальном обьявлении переменных нет (в данном случае), но всё же это не помешает.

Цитата:
Цикл Switch-Case-EndSwitch полностью аналогичен циклу Select-Case-EndSelect или есть отличия ?
Отличия в том, что при Select подстанавливается полное условие - Case 1 = 1, а при Switch можно один раз указать с чем следует использовать (сравнивать) условия - Switch $Test.... Case 1 - этот случай будет выполнен если переменная $Test будет ровна 1.

Цитата:
Правильно ли я понял ,что независимо от появляющихся впоследствии элементов GUI , опрос
об их состояниях (значениях) производится ВСЕГДА в одном общем цикле While-Wend ?
Не всегда, при желании (необходимости) можно создавать несколько циклов.

Цитата:
Можно ли вместо вывода информации в окне MsgBox осуществлять вывод в том же окне GUI ?
Можно, нужно строить также новый ГУИ

Цитата:
Можно ли для очиски окна использовать GUICtrlDelete($ControlID) или GuiCtrlSetData($ControlID, "") - что правильнее ?
если нужно поменять значение у текстовой строки (Label), то лучше использовать GuiCtrlSetData($ControlID, ""), для полного удаления контроля из ГУИ, нужно использовать GUICtrlDelete($ControlID).

Цитата:
Как праильно осуществлять поиск ранее обсуждавшихся вопросов на форуме
Есть на этом форуме раздел поиска, там вводишь нужный запрос с нужными параметрами (есть помощь там же по поиску), и осуществляется поиск

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

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

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:51, 08-06-2007 | #491



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

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


Googler


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

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


Creat0R
Цитата:
Странно, amel27, что скажешь, от чего это может быть вызвано?
чего-то не пойму что там разработчики намутили с юникодом, кто нибудь может объяснить поведение скрипта?.. у меня значения не совпадают в 2 раза +2
Код: Выделить весь код
$u = DllStructCreate ('byte[10]')
ConsoleWrite ("Размер байтового массива: "& DllStructGetSize ($u) &@CRLF)
ConsoleWrite ("Размер данных в массиве: "& StringLen (DllStructGetData ($u,1)) &@CRLF)

Отправлено: 06:17, 08-06-2007 | #492


Googler


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

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


Creat0R
Цитата:
Вопрос в том, возможно ли и на AutoIt получить доступ к подобной информации
ИМХО не тот случай, чтобы внешним утилитам предпочесть DLLCall... Надежней будет сваять GUI-интерфейс над подходящей CMD-утилитой, благо возможностей в AutoIT предостаточно... Дополнительные линки по теме:

http://www.thefreecountry.com/utilit...kedfiles.shtml
http://www.microsoft.com/technet/sys...on/Handle.mspx

З.Ы. Поясню свою позицию. Дело в том, что в Windows нет документированных API-функций по перечислению открытых хэндлов, все подобные утилиты используют недокументированные вызовы функций ядра что не есть хорошо для обычного приложения, в частности могут возникать утечки памяти... При вызове внешних приложений таких проблем не возникает, так как при закрытии процесса система подчищает за ним все "хвосты". Лопата здесь лежит: http://forum.sysinternals.com/forum_...ID=3577&a%20mp.
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:16, 08-06-2007 | #493


Googler


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

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


Creat0R
Помнится, мы мучали функцию _PathSplitByRegExp()... Так вот оказалось, что RegExp-аналог оригинальной функции _PathSplit() занимает всего одну строчку...
Код: Выделить весь код
#include <array.au3>

$path = 'C:\Program Files\AutoIT3\test.au3'
$p = StringRegExp ($path, '(?i)^\s*([A-Z]:|\\\\[^\\]*)(\\.*\\)(.*?)(\.?[^\.]*)\s*$', 3)

_ArrayDisplay ($p, $path)

Последний раз редактировалось amel27, 09-06-2007 в 05:35.

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:21, 08-06-2007 | #494


Аватара для gregaz

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


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

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


Creat0R !
Спасибо за пример и разьяснения !
Все встает на свои места.

Еще пару вопросов,если можно :

1.На вопрос: Можно ли вместо вывода информации в окне MsgBox осуществлять вывод в том же окне GUI ?
был дан ответ : Можно, нужно строить также новый ГУИ .

А разве нельзя в этом же GUI вот так(тот же пример) : ? Вроде работает.

Код: Выделить весь код
Global $Input1, $Input2, $ReadButton=-1, $SaveButton=-1

$Gui = GUICreate("Demo GUI", 400, 300)

$Label1 = GUICtrlCreateLabel("Строка 1", 20, 50, 300,40)
$Label2 = GUICtrlCreateLabel("Строка 2", 20, 100, 300,40)

$Button1 = GUICtrlCreateButton("Button1", 100, 260, 70)
$Button2 = GUICtrlCreateButton("Button2", 250, 260, 70)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $Button1 ;нажата кнопка "Button1"
            ;Нажата кнопка "Button1", а значит стираем инфу и вместо неё пишем другую
            ;(можно конечно удалять контроли и создавать новые, но не вижу в этом смысла ;) )...
            GUICtrlSetData($Label1, "Новая строка 1")
            GUICtrlSetData($Label2, "Новая строка 2")

                        ;Создаём поля ввода
            $Input1 = GUICtrlCreateInput("Поле ввода 1", 20, 140, 300)
            $Input2 = GUICtrlCreateInput("Поле ввода 2", 20, 180, 300)

                        ;Создаём кнопки Read-Save
            $ReadButton = GUICtrlCreateButton("Read", 100, 220, 70)
            $SaveButton = GUICtrlCreateButton("Save", 250, 220, 70)
        Case $Button2 ;нажата кнопка "Button2"
            ;Удаляем всё кроме кнопок "Button1" и "Button2"
            GUICtrlDelete($Label1)
            GUICtrlDelete($Label2)
            GUICtrlDelete($Input1)
            GUICtrlDelete($Input2)
            GUICtrlDelete($ReadButton)
            GUICtrlDelete($SaveButton)
        Case $ReadButton ;нажата кнопка "Read"
            ;Выводим тот текст что создали (я так понял это нужно?)
			GUICtrlSetData($Label1, "Поле ввода 1" & @LF & "Поле ввода 2")
;			MsgBox(64, "Info", "Поле ввода 1" & @LF & "Поле ввода 2")
        Case $SaveButton ;нажата кнопка "Save"
            ;Выводим то что в полях ввода
            $ReadInput1 = GUICtrlRead($Input1)
            $ReadInput2 = GUICtrlRead($Input2)
			GUICtrlSetData($Label2, $ReadInput1 & @LF & $ReadInput2)
;			MsgBox(64, "Info", $ReadInput1 & @LF & $ReadInput2)
    EndSwitch
WEnd
Может быть такая кострукция в чем то неверна и это скажется в других случаях ?

2. Просьба привести любой простой пример выполнения опросов состояний элементов GUI в разных циклах
Может быть даже в том же примере провести опрос состояний кнопок "Read" и "Save"в отдельном цикле ?
3. Что означает Case -3 (GUIGetMsg()= -3 )? Какой-то идентификатор завершения процессов ???

Отправлено: 17:46, 08-06-2007 | #495


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


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

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


Creat0R
Цитата:
как выяснилось, это вызвано тем, что самопальная функция возвращает символы перевода строки на конце переменной выбранных файлов. При передаче подобной переменной в проверку словаря, действие проваливается.
OK, тестирую...
Код: Выделить весь код
$Dict=ObjCreate("Scripting.Dictionary")
Dim $var[4]
$var[0]="test1 -->" & @CRLF & "<-- возврат каретки и перенос строки"
$var[1]="test2" & @CRLF
$var[2]=@CRLF & "test3" & @CRLF
$var[3]=@CRLF & @CRLF & @LF & @LF & @CR & @CR

;~ Добавление ключей:
For $o In $var
	$Dict.Add($o,"")
Next

;~ Проверка добавленных ключей:
For $o In $var
	If $Dict.Exists($o) Then
;~ 	OK!
	Else
;~ 	...
	EndIf
Next
;~ У меня не вылетает

;~ Проверка несуществующего ключа
MsgBox(0,"Должен быть: 0",$Dict.Exists("test5"))

;~ Проверка массива:
$arrayKey=$Dict.Keys
For $i=0 To $Dict.Count-1
	MsgBox(0,"Перебор массива...",$arrayKey[$i])
Next
;~ Всё на своём месте.
Наверное дело в чём то другом...
Похожая ошибка возникает при попытке добавить в словарь ключ (Кеу) который там уже существует. (Словарь - изначально не поддерживает дубликаты)


Отправлено: 20:12, 08-06-2007 | #496


Аватара для Creat0R

Must AutoIt


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

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


amel27
Цитата:
Лопата здесь лежит:
Спасибо, немного покапал, правда не очень глубоко...

Утилита из того топика, вызвращает хэндлы TCP/UDP (правда не совсем понимаю что это), для обычных файлов информации нет .

Взял утилиту из второго линка, она возвращает то что нужно, но 400 с лишним кб, это тяжко, даже очень тяжко .

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

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

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


Отправлено: 23:06, 08-06-2007 | #497


Аватара для Creat0R

Must AutoIt


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

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


amel27
Цитата:
оказалось, что RegExp-аналог оригинальной функции _PathSplit() занимает всего одну строчку...
Оригинально, прадва расширение не возвращается...
Но вообще то, я делал функцию _PathSplitByRegExp() не как аналог функции _PathSplit(), а как что то более юзабельное и функциональнее, можно сказать что это как бы “мод” той функции .


gregaz
Цитата:
А разве нельзя в этом же GUI вот так(тот же пример)
Можно, но лучше отдельно построить ГУИ для вывода информации, и поместить его в функцию, чтобы при каждом вызове небыло необходимости строить занового гуи:

Код: Выделить весь код
#include <GuiConstants.au3>

$Gui = GUICreate("Demo GUI", 400, 300)

$Button1 = GUICtrlCreateButton("Button1", 100, 260, 70)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1 ;нажата кнопка "Button1"
            $Ret = _GuiMsgBox($WS_EX_TOPMOST, 2, "Info", "Текст 1" & @LF & "Текст 2", 330, 120, _
                "Больше не показывать", "OK", "Отмена", $Gui)
            MsgBox(0, "", "Вернувшееся значение: " & $Ret)
    EndSwitch
WEnd

;Функция для показа самодельного окна MsgBox
Func _GuiMsgBox($Type, $ButtonsNumber, $Title, $Text, $Left, $Top, $CheckBoxText, $FirstButtonText="OK", $SecondButtonText="Cancel", $hWnd=0)
    Local $Yes, $No, $OK, $CheckBox=-1, $Gui, $Msg, $ReturnVal = 0

        If $hWnd <> 0 Then WinSetState($hWnd, "", @SW_DISABLE)

        $Gui = GuiCreate($Title, $Left, $Top, -1, -1, -1, $Type, $hWnd)

    GUICtrlCreateLabel($Text, ($Left-($Left-($Left/2/2)))/2, (($Top/2)/2)-10, $Left-($Left/2/2), 40, $SS_CENTER)

    Select
        Case $ButtonsNumber = 2
            $Yes = GUICtrlCreateButton($FirstButtonText, ($Left/2)-90, ($Top/2), 70, 20)
            $No = GUICtrlCreateButton($SecondButtonText, ($Left/2)+20, ($Top/2), 70, 20)
        Case $ButtonsNumber > 2 Or $ButtonsNumber <= 1
            $OK = GUICtrlCreateButton($FirstButtonText, ($Left-70)/2, $Top/2, 70, 20)
    EndSelect

    If $CheckBoxText <> "" Then $CheckBox = GUICtrlCreateCheckbox($CheckBoxText, 15, $Top-30)
    GuiSetState(@SW_SHOW, $Gui)

    While 1
        $Msg = GUIGetMsg()
        Select
            Case $ButtonsNumber = 2 And $Msg = $Yes
                If GUICtrlRead($CheckBox) = 1 Then
                    $ReturnVal = 6+8
                Else
                    $ReturnVal = 6
                EndIf
                ExitLoop
            Case $ButtonsNumber = 2 And $Msg = $No
                If GUICtrlRead($CheckBox) = 1 Then
                    $ReturnVal = 7+8
                Else
                    $ReturnVal = 7
                EndIf
                ExitLoop
            Case ($ButtonsNumber = 1 Or $ButtonsNumber <> 2) And $Msg = $OK
                If GUICtrlRead($CheckBox) = 1 Then
                    $ReturnVal = 1+8
                Else
                    $ReturnVal = 1
                EndIf

                            Case $Msg = -3
                ExitLoop
        EndSelect
    Wend
    If $hWnd <> 0 Then WinSetState($hWnd, "", @SW_ENABLE)
    GUIDelete($Gui)
    Return $ReturnVal
EndFunc
Цитата:
Просьба привести любой простой пример выполнения опросов состояний элементов GUI в разных циклах
Не уверен что понимаю просьбу, что значить в разных циклах? цикл не важен, важно действие, что именно требуеся опрашивать, если нужно проверить текст поля ввода, тогда GuiCtrlGetData, если нужно проверить зажат ли той или инной чекбокс (птичка), тогда GuiCtrlRead() - если 1, тогда зажата, в противном случе вернётся 4, и т.д.

Цитата:
Что означает Case -3 (GUIGetMsg()= -3 )? Какой-то идентификатор завершения процессов ???
-3 это тоже самое что и $GUI_EVENT_CLOSE, я просто изначально значение многих констант выучил наизусть, поэтому по привычке использую их как есть, это иногда удобно, и позволяет не использовать вложения библиотеки, типа #Include <GuiConstants.au3>. $GUI_EVENT_CLOSE это константа, функция GuiGetMsg() возвращает её значение (-3) если послана команда закрыть окно ГУИ (пользователь нажал крестик закрытия программы).

Diamond
Цитата:
Наверное дело в чём то другом...
Возможно...

Цитата:
Похожая ошибка возникает при попытке добавить в словарь ключ (Кеу) который там уже существует.
Но у меня выводилась ошибка именно на строке с проверкой $Dict.Exists...

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:03, 09-06-2007 | #498


Googler


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

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


Creat0R
Цитата:
правда расширение не возвращается
енто частности, уже исправил.

Кстати, насчет твоего старого вопроса о массовой замене и функции _StringRexExpReplaceEx… зачем там RegExp? Имхо вариант с обычным StringReplace справится лучше, плюсы очевидны:

- работает быстрее;
- нет проблем с форматными символами (речь о "|");
- если элементу из массива $Pattern нет соответствия в $Replace автоматически предполагается пустая строка.
Код: Выделить весь код
$String = 'file://localhost/%22c:/my%20test/test.zip%22'
Dim $Pattern [4] = ['/','%20','%22','file:\\localhost\']
Dim $Replace[3] = ['\',' ','"']

Func _StringReplaceEx ($String, $Pattern, $Replace)
    Local $i
    ReDim $Replace[UBound($Pattern)]
    For $i=0 To UBound($Pattern)-1
        ConsoleWrite ($Pattern[$i]&':'&$Replace[$i]&@CRLF)
        $String = StringReplace ($String, $Pattern[$i], $Replace[$i])
    Next
    Return $String
EndFunc

MsgBox (64, "Results", _StringReplaceEx ($String, $Pattern, $Replace)) ;На выходе имеем это: "c:\my test\test.zip"
Это сообщение посчитали полезным следующие участники:

Отправлено: 06:28, 09-06-2007 | #499


Аватара для gregaz

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


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

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


Creat0R
функция _GuiMsgBox достаточно громоздкая видимо из-за своей универсальности(на все случаи жизни)
Попробую разобраться в ней.
А пока 1 вопрос :
При закрытии дочернего окна GUI у меня обычно закрывается и родительсое окно.
У тебя же в примере этого не происходит .
Чем это достигнуто ?

Отправлено: 09:26, 09-06-2007 | #500



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




 
Переход