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

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


amel27
Цитата:
возможные параметры
Спасибо. Я только не совсем понимаю какой из них мне нужен (склоняюсь к INTERNET_OPEN_TYPE_DIRECT, но не уверен), и как быть с InetGet()? может есть такая же самодельная функция с подобным выходом в сеть как и у _InetGetSource()?

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

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

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


Отправлено: 18:47, 16-02-2007 | #201



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

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


Googler


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

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


Creat0R
Цитата:
склоняюсь к INTERNET_OPEN_TYPE_DIRECT
правильно склоняешься
Цитата:
может есть такая же самодельная функция с подобным выходом в сеть как и у _InetGetSource()?
готовой чего-то не видать.... а все штатные очевидно используют настройки профиля. Как временный вариант могу предложить сугубо админский подход - запускать скрипт из-под другого узера, у которого в профиле отключен прокси (через RunAsSet)
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:13, 17-02-2007 | #202


Googler


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

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


Creat0R
Уф, добил таки самопальный _FileSelectFolder, только есть два замечания:
1. Внимание! В параметре $root передается код папки (CSIDL), но ни в коем случае не путь к ней!
2. Функция не поддерживает параметр каталога по умолчанию ("initial dir")... хотя теоретически эту фичу можно реализовать через GUICtrlSendMsg (), т.к. окно выбора может принимать сообщения пред-селекта и установки текста статус-бара
Код: Выделить весь код
Func _FileSelectFolder ($title, $root = 0, $flags = 0, $hwnd = 0)
    Local $ret, $pidl, $res = ''
    ; Создание структур данных
    Local $ubi = DllStructCreate ("hwnd;ptr;ptr;ptr;int;ptr;ptr;int") ; управляющая структура BROWSEINFO
    Local $utl = DllStructCreate ("char[512],char") ; заголовок окна
    Local $urs = DllStructCreate ("char[260]") ; буфер для возвращаемого пути (длиной MAX_PATH)
    Local $ulf = BitOR (BitShift(BitAnd ($flags,1),-9), _ ; 1: не позволять создавать новые каталоги
        BitShift(BitAnd ($flags,2),-5), _ ; 2: использовать новый стиль диалога
        BitShift(BitAnd ($flags,4),-2)) ; 4: включить cтроку редактирования
    ; Заполнение структур данных
    DllStructSetData ($utl, 1, $title)
    DllStructSetData ($ubi, 1, $hwnd)
    DllStructSetData ($ubi, 3, DllStructGetPtr($urs))
    DllStructSetData ($ubi, 4, DllStructGetPtr($utl))
    DllStructSetData ($ubi, 5, $ulf)
    $ret = DllCall ("shell32.dll", "ptr", "SHGetSpecialFolderLocation", _
        "int", 0 , _
        "int", $root , _
        "ptr", DllStructGetPtr($ubi, 2))
    If $ret[0] Then Return $res
    ; Открытие окна выбора каталога
    $pidl = DllCall ("shell32.dll", "ptr", "SHBrowseForFolder", "ptr", DllStructGetPtr ($ubi))
    If $pidl[0] Then
        $ret = DllCall ("shell32.dll", "int", "SHGetPathFromIDList", _
            "ptr", $pidl[0], _
            "ptr", DllStructGetPtr ($urs))
        If $ret[0] Then $res = DllStructGetData ($urs, 1)
        DllCall ("ole32.dll", "int", "CoTaskMemFree", "ptr", $pidl[0]) ; чистим за собой
    EndIf
    DllCall ("ole32.dll", "int", "CoTaskMemFree", "ptr", DllStructGetData ($ubi, 2))
    Return $res ; Вывод результата
EndFunc

Последний раз редактировалось amel27, 20-02-2007 в 08:52.

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

Отправлено: 10:29, 17-02-2007 | #203


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


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

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


amel27
Цитата:
Обнови версию AutoIT - это новая фича, еще не устаканилась
Дело оказалось не в версии, видимо, код неправильно скопировался (почему-то полностью отсутствовали символы *, | и \) Наверное, когда копировал код с форума, страница не до конца загрузилась...
Приношу свои извинения.

Отправлено: 19:45, 17-02-2007 | #204


Новый участник


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

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


Mihal> Можно ли с помощью AutoIt проделать такую операцию?
Mihal> То есть "взять некий WAV-файл мышкой" и "кинуть его на окошко этой проги"

amel27> обычно перетаскивание можно заменить на копировать/вставить через буфер обмена...

в этой проге (yamaha'вская wscma) нет "вставить" к сожалению.

Отправлено: 22:50, 17-02-2007 | #205


Аватара для Creat0R

Must AutoIt


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

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


amel27
Цитата:
добил таки самопальный _FileSelectFolder
Огромное челевечное спасибо!!!

Цитата:
Функция не поддерживает параметр каталога по умолчанию ("initial dir")...
Жалко, один из самых важных параметров этой функции...

Цитата:
хотя теоретически эту фичу можно реализовать через GUICtrlSendMsg ()
Хм... я пробовал, но что то не получается , во-первых я не очень понимаю как её использовать в данном случае, а во-вторых на момент вызова самой функции (_FileSelectFolder) скрипт как бы останавливается, и послать что либо просто невозможно... может нужно в самой функции где то ставить посылание параметров, но я так и не понял где.

Но всё же ещё раз огромное спасибо за эту долгожданную функцию

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


Отправлено: 01:11, 18-02-2007 | #206


Googler


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

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


Creat0R
Цитата:
я не очень понимаю как её использовать в данном случае
Подобные фокусы обычно реализуются через CallBack-функции для окон, но к сожалению пока AutoIT позволяет их регистрировать только для лист-контролов (GUICtrlRegisterListViewSort). По сути требуется лишь узнать точку входа AutoIT-функции и передать этот указатель как параметр.... но пока ничего кроме создания "фиктивного" лист-контрола ничего не приходит в голову, а это имхо из разряда извращений

FYI: "по горячему" немного оптимизировал код

Отправлено: 07:23, 18-02-2007 | #207


Аватара для Creat0R

Must AutoIt


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

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


amel27
Цитата:
кроме создания "фиктивного" лист-контрола ничего не приходит в голову, а это имхо из разряда извращений
Это тот самый лист котроль над которым я извращался тут? (пост номер 694).

Немного поизвращался в другом направлении, и сделал нужные для себя функции связанные с массивами, но подумал может кому то ещё пригодятся (комментов нет, но думаю запустив примеры всё довольно быстро станет ясно):

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

Dim $Arr1[4]
$Arr1[0] = UBound($Arr1) - 1
$Arr1[1] = "Hello"
$Arr1[2] = "My"
$Arr1[3] = "Friend!"

Dim $Arr2[4]
$Arr2[0] = UBound($Arr2) - 1
$Arr2[1] = "AutoIt"
$Arr2[2] = "Is"
$Arr2[3] = "The best!"

_ArrayDisplay($Arr1, "Display the first array")
_ArrayDisplay($Arr2, "Display the second array")

_ArrayJoin($Arr1, $Arr2, 1)

_ArrayDisplay($Arr1, "Demo of _ArrayJoin() function")

_ArrayClone($Arr1, 2)

_ArrayDisplay($Arr1, "Demo of _ArrayClone() function")

_ArrayDeleteClones($Arr1)

_ArrayDisplay($Arr1, "Demo of _ArrayDeleteClones() function")

_ArrayClear($Arr1)

_ArrayDisplay($Arr1, "Demo of _ArrayClean() function")

Func _ArrayJoin(ByRef $Array1, ByRef $Array2, $JoinedArray=1)
    If IsArray($Array1) And IsArray($Array2) Then
        If $JoinedArray = 1 Then
            For $iArr = 1 To UBound($Array2) - 1
                ReDim $Array1[UBound($Array1) + 1]
                $Array1[UBound($Array1) - 1] = $Array2[$iArr]
            Next
            $Array1[0] = UBound($Array1) - 1
        Else
            For $iArr = 1 To UBound($Array1) - 1
                ReDim $Array2[UBound($Array2) + 1]
                $Array2[UBound($Array2) - 1] = $Array1[$iArr]
            Next
            $Array2[0] = UBound($Array2) - 1
        EndIf
        SetError(0)
    Else
        SetError(1)
        Return -1
    EndIf
EndFunc

Func _ArrayClone(ByRef $Array, $Repeat=1)
    If IsArray($Array) Then
        Local $TempArr = $Array
        For $iR = 1 To $Repeat
            For $iArr = 1 To UBound($TempArr) - 1
                ReDim $Array[UBound($Array) + 1]
                $Array[UBound($Array) - 1] = $TempArr[$iArr]
            Next
            $Array[0] = UBound($Array) - 1
        Next
        SetError(0)
        Return 1
    Else
        SetError(1)
        Return -1
    EndIf
EndFunc

Func _ArrayDeleteClones(ByRef $Array)
    If IsArray($Array) Then
        Local $StringWithDelValue
        For $iD = 1 To UBound($Array) - 1
            $FindInArr = _ArraySearch($Array, $Array[$iD])
            If $FindInArr <> $iD Then $StringWithDelValue &= $Array[$iD] & "|"
        Next
        If $StringWithDelValue <> "" Then
            $TempArrOfIndexesString = StringSplit($StringWithDelValue, "|")
            If IsArray($TempArrOfIndexesString) Then
                For $iI = 1 To $TempArrOfIndexesString[0]
                    $CurrentIndexToDel = _ArraySearch($Array, $TempArrOfIndexesString[$iI])
                    If $CurrentIndexToDel = -1 Then ExitLoop
                    _ArrayDelete($Array, $CurrentIndexToDel)
                Next
            Else
                _ArrayDelete($Array, StringReplace($StringWithDelValue, "|", ""))
            EndIf
            $Array[0] = UBound($Array) - 1
            SetError(0)
            Return 1
        Else
            SetError(0)
            Return 0
        EndIf
    Else
        SetError(1)
        Return -1
    EndIf
EndFunc

Func _ArrayClear(ByRef $Array)
    If IsArray($Array) Then
        For $iArr = 1 To UBound($Array) - 1
            _ArrayDelete($Array, $iArr)
        Next
        $Array[0] = 0
        SetError(0)
        Return 1
    Else
        SetError(1)
        Return -1
    EndIf
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


Отправлено: 09:31, 18-02-2007 | #208


Аватара для Creat0R

Must AutoIt


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

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


Ещё функция для работы с массивом - _ArrayReplace() - Кстати, предыдущие и эта функция, работают только с одномерным (с одним элементом) массивом:

Код: Выделить весь код
Func _ArrayReplace(ByRef $Array, $ValueToReplace, $NewValue)
    Local $IsReplaced = 0
    If IsArray($Array) Then
        For $iR = 1 To UBound($Array) - 1
            $Array[$iR] = StringReplace($Array[$iR], $ValueToReplace, $NewValue)
            If StringInStr($Array[$iR], $ValueToReplace) Then $IsReplaced = 1
        Next
        SetError(0)
        If $IsReplaced = 1 Then
            Return 1
        Else
            Return 0
        EndIf
    Else
        SetError(1)
        Return -1
    EndIf
EndFunc
Эта функция позволяет произвести замену значении в массиве.

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


Отправлено: 22:57, 18-02-2007 | #209


Аватара для Creat0R

Must AutoIt


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

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


Всем всем!

Кому интересна фича отката скрытых папок и расширении файлов, посмотрите на эти два скрипта:

Для отката расширении файлов:

Код: Выделить весь код
$RegKey = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
If RegRead($RegKey, "HideFileExt") Then
    RegWrite($RegKey, "HideFileExt", "REG_DWORD", 0)
Else
    RegWrite($RegKey, "HideFileExt", "REG_DWORD", 1)
EndIf

UpdateExplorer()

Func UpdateExplorer()
    $WinExpListArr = _ExplWinGetList()
    If IsArray($WinExpListArr) Then
        For $iWin = 1 To $WinExpListArr[0]
            $GetWinState = WinGetState($WinExpListArr[$iWin])
            $Hwnd = WinGetHandle($WinExpListArr[$iWin])
            DllCall("user32.dll", "long", "SendMessage", "hwnd", $hWnd, "int", 0x111, "int", 28931, "int", 0)
        Next
    EndIf

        Opt("WinTitleMatchMode", 4)
    $Hwnd = WinGetHandle("classname=Progman")
    DllCall("user32.dll", "long", "SendMessage", "hwnd", $hWnd, "int", 0x111, "int", 28931, "int", 0)
EndFunc

Func _ExplWinGetList()
    Opt("WinTitleMatchMode", 4)
    $WinList = WinList("classname=CabinetWClass")
    If IsArray($WinList) Then
        Local $WinListArr[$WinList[0][0]+1]
        For $iW = 1 To $WinList[0][0]
            $WinListArr[$iW] = $WinList[$iW][0]
        Next
        $WinListArr[0] = $WinList[0][0]
        Return $WinListArr
    Else
        Return ""
    EndIf
EndFunc

Для отката скрытых папок и файлов:

Код: Выделить весь код
$RegKey = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
If RegRead($RegKey, "Hidden") = 1 Then
    RegWrite($RegKey, "Hidden", "REG_DWORD", 2)
Else
    RegWrite($RegKey, "Hidden", "REG_DWORD", 1)
EndIf

UpdateExplorer()

Func UpdateExplorer()
    $WinExpListArr = _ExplWinGetList()
    If IsArray($WinExpListArr) Then
        For $iWin = 1 To $WinExpListArr[0]
            $GetWinState = WinGetState($WinExpListArr[$iWin])
            $Hwnd = WinGetHandle($WinExpListArr[$iWin])
            DllCall("user32.dll", "long", "SendMessage", "hwnd", $hWnd, "int", 0x111, "int", 28931, "int", 0)
        Next
    EndIf

        Opt("WinTitleMatchMode", 4)
    $Hwnd = WinGetHandle("classname=Progman")
    DllCall("user32.dll", "long", "SendMessage", "hwnd", $hWnd, "int", 0x111, "int", 28931, "int", 0)
EndFunc

Func _ExplWinGetList()
    Opt("WinTitleMatchMode", 4)
    $WinList = WinList("classname=CabinetWClass")
    If IsArray($WinList) Then
        Local $WinListArr[$WinList[0][0]+1]
        For $iW = 1 To $WinList[0][0]
            $WinListArr[$iW] = $WinList[$iW][0]
        Next
        $WinListArr[0] = $WinList[0][0]
        Return $WinListArr
    Else
        Return ""
    EndIf
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


Последний раз редактировалось Creat0R, 19-02-2007 в 09:53.


Отправлено: 02:14, 19-02-2007 | #210



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




 
Переход