|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 1.3] AutoIt скрипты |
|
[Архив - Часть 1.3] AutoIt скрипты
|
Старожил Сообщения: 250 |
Внимание! Тема переведена в архивное состояние (настоятельно рекомендуется к прочтению/поиску) Руководство к действию по работе 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 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27
Цитата:
|
|
------- Отправлено: 18:47, 16-02-2007 | #201 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
![]() Цитата:
|
||
Отправлено: 10:13, 17-02-2007 | #202 |
Googler Сообщения: 3665
|
Профиль | Отправить 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
|
Профиль | Отправить PM | Цитировать amel27
Цитата:
![]() Приношу свои извинения. ![]() |
|
Отправлено: 19:45, 17-02-2007 | #204 |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать Mihal> Можно ли с помощью AutoIt проделать такую операцию?
Mihal> То есть "взять некий WAV-файл мышкой" и "кинуть его на окошко этой проги" amel27> обычно перетаскивание можно заменить на копировать/вставить через буфер обмена... в этой проге (yamaha'вская wscma) нет "вставить" к сожалению. |
Отправлено: 22:50, 17-02-2007 | #205 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27
Цитата:
![]() Цитата:
Цитата:
![]() Но всё же ещё раз огромное спасибо за эту долгожданную функцию ![]() P.S На офф форуме кстати, тоже вроде с нетерпением её ожидают ![]() |
|||
------- Отправлено: 01:11, 18-02-2007 | #206 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
![]() FYI: "по горячему" немного оптимизировал код |
|
Отправлено: 07:23, 18-02-2007 | #207 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27
Цитата:
![]() Немного поизвращался в другом направлении, и сделал нужные для себя функции связанные с массивами, но подумал может кому то ещё пригодятся ![]() #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 |
|
------- Отправлено: 09:31, 18-02-2007 | #208 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить 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 А как определять является ли массив двухмерным, или нет? |
------- Отправлено: 22:57, 18-02-2007 | #209 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить 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 В сети можно найте несколько подобных расширении, но я ещё не видел подобное, чтобы весь процесс проходил незаметно. Вот если бы ещё найти способ как внедрить пункт в контекстное меню папки, по нажатию которого и запускался бы этот скрипт (в закомпилированном виде), то это было бы вообще шикарно! |
------- Последний раз редактировалось Creat0R, 19-02-2007 в 09:53. Отправлено: 02:14, 19-02-2007 | #210 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Открывая 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 |
|