|
Компьютерный форум 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 | Цитировать TERMINAL
Цитата:
Чтобы отформатировать диск, можно использовать ком. строку: $DriveToFormat = 'Z:' $Confirm = 'no'; 'yes' для подтверждения удаления $FOpen = FileOpen(@TempDir & '\Answer.tmp', 2) FileWrite($FOpen, $Confirm) FileClose($FOpen) $CmdPid = Run(@ComSpec & ' /c formart ' & $DriveToFormat & ' < "' & @TempDir & '\Answer.tmp"') While Not ProcessExists($CmdPid) Sleep(10) WEnd FileDelete(@TempDir & '\Answer.tmp') ![]() Системны диск отформатировать из запущенной Windows не получится ![]() |
|
------- Отправлено: 00:51, 05-05-2007 | #381 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
Цитата:
http://www.autoitscript.com/forum/in...howtopic=32691 Цитата:
#include <GUIConstants.au3> Global Const $BFFM_SETSELECTION = $WM_USER + 102 ; BFFM_SETSELECTION $initDir = "C:\Windows\System32" ; Стартовый каталог ; Создаем и заполняем структуру для $initDir $str = DllStructCreate ("char[260]") DllStructSetData ($str, 1, $initDir) ; Ищем окно управляющего скрипта $hOpenDialogControl = WinGetHandle ("_FileOpenDialogControl") ; Если найдено, отправляем сообщение с указателем If Not @error Then $ret = DllCall ("user32.dll", "int", "SendMessage", _ "hwnd", $hOpenDialogControl, _ "int", $BFFM_SETSELECTION, _ "int", 1, _ "ptr", DllStructGetPtr ($str) ) EndIf ; Открываем главное окно выбора $files = _FileSelectFolder ('Тестирование выбора каталога') #include <GUIConstants.au3> Global Const $BFFM_SETSELECTION = $WM_USER + 102 ; BFFM_SETSELECTION Global $arrMsgSend [1][4]=[[0,0,0,0]] ; Массив сообщений для отправки ; Создаем фиктивное окно (для приема сообщений) $hWndMain = GUICreate("_FileOpenDialogControl") ; Регистрируем наше пользовательское сообщение GUIRegisterMsg ($BFFM_SETSELECTION, "_SaveMsgParms") ; Ждем открытия главного окна WinWait ("Обзор папок") ; Обработка полученных сообщений If $arrMsgSend[0][0] Then $hMsgWnd = WinGetHandle ("Обзор папок") For $i=1 To $arrMsgSend[0][0] $ret = DllCall ("user32.dll", "int", "SendMessage", _ "hwnd",$hMsgWnd, _ "int", $arrMsgSend[$i][1], _ "int", $arrMsgSend[$i][2], _ "ptr", $arrMsgSend[$i][3] ) Next EndIf ; Функция обработки входящих сообщений Func _SaveMsgParms($hWnd, $iMsg, $WParam, $LParam) Switch $iMsg Case $BFFM_SETSELECTION $arrMsgSend[0][0]+=1 ReDim $arrMsgSend[$arrMsgSend[0][0]+1][4] $arrMsgSend[$arrMsgSend[0][0]][1] = $BFFM_SETSELECTION $arrMsgSend[$arrMsgSend[0][0]][2] = $WParam $arrMsgSend[$arrMsgSend[0][0]][3] = $LParam EndSwitch EndFunc |
|||
Отправлено: 08:53, 05-05-2007 | #382 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
|
|
Отправлено: 09:15, 05-05-2007 | #383 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27
Цитата:
Цитата:
![]() Может можно как то передавать нужные данные через ком. строку? (в этот же скрипт к примеру). Но вообще, оно работает, огромнейшее спасибо за пример - спустя полтора часа колдования над ним, мне наконец удалось поместить всё это в более или менее юзабельные UDF'ы ![]() Правда есть один момент - Не получается нормально определить заголовок окна выбора каталога (Обзор папок), хотелось сделать универсально, но даже при попытке использовать класс имени окна ("classname=#32770"), почему то вместо окна обзора папок находит окно диспетчера задач... и кстати, интересно, в английской версии Windows как это окно называется, я предположил что Select folder, но не уверен. Вот собственно адаптированные функции и пример использования: Пример: #include <GUIConstants.au3> #NoTrayIcon Global Const $BFFM_SETSELECTION = $WM_USER + 102 _FileSelFolderHandler() $hWnd = WinGetHandle(WinGetTitle("")) $InitDir = @WindowsDir $FileNeeded = "Notepad.exe" While 1 $Ret = _FileSelectFolder('Select Folder', 0, 1, $InitDir, $hWnd) If @error Then ExitLoop If FileExists($Ret & "\" & $FileNeeded) Then ExitLoop MsgBox(48, "Error", "Please select folder that contain " & $FileNeeded, 3) $InitDir = $Ret WEnd If Not @error Then MsgBox(64, "Results", "File <" & $FileNeeded & "> was found in selected directory (" & $Ret & ")") ![]() Функции: Func _FileSelectFolder($title, $root = 0, $flags = 0, $InitDir = '', $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), 1) ; 4: включить cтроку редактирования ;Последняя единица для деактивирования кнопки OK. ; Заполнение структур данных 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 ;Запуск управляющего скрипта Local $RunLine = '"' & @ScriptFullPath If Not @Compiled Then $RunLine = @AutoItExe & ' "' & @ScriptFullPath Run($RunLine & '" /SetInitDir') WinWait("_FileOpenDialogControl", "", 3) ; Создаем и заполняем структуру для $initDir $str = DllStructCreate ("char[260]") DllStructSetData ($str, 1, $initDir) ; Ищем окно управляющего скрипта $hOpenDialogControl = WinGetHandle("_FileOpenDialogControl") ; Если найдено, отправляем сообщение с указателем If Not @error Then $ret = DllCall ("user32.dll", "int", "SendMessage", _ "hwnd", $hOpenDialogControl, _ "int", $BFFM_SETSELECTION, _ "int", 1, _ "ptr", DllStructGetPtr ($str) ) EndIf ; Открытие окна выбора каталога $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]) ; чистим за собой Else Return SetError(1) EndIf DllCall ("ole32.dll", "int", "CoTaskMemFree", "ptr", DllStructGetData ($ubi, 2)) Return $res ; Вывод результата EndFunc Func _FileSelFolderHandler() If $CmdLine[0] > 0 And $CmdLine[1] = "/SetInitDir" Then Local $FSFTitle = "Обзор папок", $hMsgWnd If @OSLang <> 0419 Then $FSFTitle = "Select Folder" Global $arrMsgSend [1][4]=[[0,0,0,0]] Local $hWndMain = GUICreate("_FileOpenDialogControl") GUIRegisterMsg ($BFFM_SETSELECTION, "_SaveMsgParms") WinWait($FSFTitle, "", 3) If $arrMsgSend[0][0] Then $hMsgWnd = WinGetHandle($FSFTitle) For $i=1 To $arrMsgSend[0][0] DllCall ("user32.dll", "int", "SendMessage", _ "hwnd",$hMsgWnd, _ "int", $arrMsgSend[$i][1], _ "int", $arrMsgSend[$i][2], _ "ptr", $arrMsgSend[$i][3] ) Next EndIf Exit EndIf EndFunc Func _SaveMsgParms($hWnd, $iMsg, $WParam, $LParam) Switch $iMsg Case $BFFM_SETSELECTION $arrMsgSend[0][0]+=1 ReDim $arrMsgSend[$arrMsgSend[0][0]+1][4] $arrMsgSend[$arrMsgSend[0][0]][1] = $BFFM_SETSELECTION $arrMsgSend[$arrMsgSend[0][0]][2] = $WParam $arrMsgSend[$arrMsgSend[0][0]][3] = $LParam EndSwitch EndFunc |
||
------- Последний раз редактировалось Creat0R, 05-05-2007 в 15:32. Отправлено: 11:52, 05-05-2007 | #384 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27
Цитата:
В общем решил я эту задачку UDF'ным путём ![]() $String = 'file://localhost/%22c:/my%20test/test.zip%22' $Patern = 'file://localhost/|/|%20|%22' $Replace = '|\\| |"' $Results = _StringRexExpReplaceEx($String, MsgBox(64, "Results", $Results) ;На выходе имеем это: "c:\my test\test.zip" Func _StringRexExpReplaceEx($String, $Patern, $Replace) If StringInStr($Patern, '|') And StringInStr($Replace, '|') Then Local $PaternArr = StringSplit($Patern, '|') Local $ReplaceArr = StringSplit($Replace, '|') Local $Ret = $String Local $Ubound = UBound($ReplaceArr) If UBound($PaternArr) <= UBound($ReplaceArr) Then $Ubound = UBound($PaternArr) For $i = 1 To $Ubound-1 $Ret = StringRegExpReplace($Ret, $PaternArr[$i], $ReplaceArr[$i]) Next Return $Ret Else Return StringRegExpReplace($String, $Patern, $Replace) EndIf EndFunc ![]() |
|
------- Последний раз редактировалось Creat0R, 05-05-2007 в 12:45. Причина: Изменил немного пример в коде. Отправлено: 12:37, 05-05-2007 | #385 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
- для одного сообщения массив понятно не нужен, это я с запасом на обработку нескольких сообщений зарядил SWITCH, ну и соответственно массив; Цитата:
![]() ADD:помнится, я еще практиковал межскриптовый обмен через ключи рееестра... скажем, один меняет значение извеcтного параметра, а второй в цикле отслеживает эти значения и делает свои выводы (по SWITH)... хотя это было вызвано совсем другими причинами - оба скрипта крутились под разными учетками, один под SYSTEM, а второй под рядовым пользователем. |
||
Последний раз редактировалось amel27, 06-05-2007 в 09:57. Отправлено: 09:02, 06-05-2007 | #386 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Вроде разобрался с DLL-кой, проблема была не в GUIRegisterMsg (она-то как раз работает), а в самой DLL-ке... Нашел где подправить чтобы запустилась, осталось только состыковаться с автором и перекомпилить как надо. ![]() Все-таки через CallBack все выглядит намного круче - можно по ходу получать инфу о выбранных файлах/каталогах, фильтрах, контролировать правильность ввода в Edit-Boxе и на основании этого менять подстветку, текст кнопок или текст статус-бара. |
Отправлено: 11:30, 07-05-2007 | #387 |
Новый участник Сообщения: 38
|
Профиль | Отправить PM | Цитировать Цитата:
Где можно узнать или где содержится этот список команд и соответствующих им ID? Нашёл ссылку, вроде бы относящуюся к делу: http://msdn2.microsoft.com/en-us/library/aa381023.aspx |
|
Отправлено: 16:30, 07-05-2007 | #388 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Автор DLL-ки подкинул идею, как можно попробовать реализовать средствами AutoIT... К сожалению, фокус прокатил только с классическим интерфейсом, но это уже большой плюс!.. Для окна в стиле Explorer без сторонних модулей видимо не обойтись. #include <GUIConstants.au3> Global Const $BFFM_SETSELECTION = $WM_USER + 102 Global Const $BIF_BROWSEFORCOMPUTER = 0x1000 ; Выбирать только компьютеры в сетевом окружении Global Const $BIF_BROWSEFORPRINTER = 0x2000 ; Выбирать только принтеры в сетевом окружении Global Const $BIF_BROWSEINCLUDEFILES = 0x4000 ; Позволить выбирать файлы Global Const $BIF_DONTGOBELOWDOMAIN = 0x2 ; Не открывать домены в сетевом окружении Global Const $BIF_EDITBOX = 0x10 ; Включить строку редактирования Global Const $BIF_RETURNONLYFSDIRS = 0x1 ; Выбирать только объекты файловой системы Global Const $BIF_OLDSTYLEFLAGS = BitOR ($BIF_BROWSEFORCOMPUTER, $BIF_BROWSEFORPRINTER, $BIF_BROWSEINCLUDEFILES, _ $BIF_DONTGOBELOWDOMAIN, $BIF_EDITBOX, $BIF_RETURNONLYFSDIRS) ; Примитивный ГУИ для примера $hWndMain = GUICreate ("Тест", 200, 45, -1, -1) $Button_1 = GUICtrlCreateButton ("Выбрать папку", 55, 10) GUISetState() While 1 $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE ExitLoop Case $msg = $Button_1 $res = _FileSelectFolderOldStyle ('Выбор объекта:', 0, $BIF_RETURNONLYFSDIRS, 'C:\Windows', $hWndMain) MsgBox (0, "Выбран объект:", $res) EndSelect Wend ; Процедура инициализации стартового каталога Func _FileSelectFolderOldStyleProc ($hWnd, $Msg, $wParam, $lParam) $ret = DllCall ("user32.dll", "int", "SendMessage", _ "hwnd",$hWnd, _ "int", $BFFM_SETSELECTION, _ "int", 1, _ "ptr", $lParam ) EndFunc Func _FileSelectFolderOldStyle ($text = '', $root = 0, $flags = 0, $iniDir = '', $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 = BitAnd ($flags, $BIF_OLDSTYLEFLAGS) ; фильтруем только разрешенные флаги ; Заполнение структур данных DllStructSetData ($utl, 1, $text) DllStructSetData ($ubi, 1, $hwnd) DllStructSetData ($ubi, 3, DllStructGetPtr($urs)) DllStructSetData ($ubi, 4, DllStructGetPtr($utl)) DllStructSetData ($ubi, 5, $ulf) If ($iniDir <> '') And ($hwnd <> 0) Then Local $udr = DllStructCreate ("char[" & StringLen ($iniDir)+1 & "]") DllStructSetData ($udr, 1, $iniDir) $ret = DllCall ("user32.dll", "ptr", "GetWindowLong", "hwnd", $hwnd, "int", -4) DllStructSetData ($ubi, 6, $ret[0]) DllStructSetData ($ubi, 7, DllStructGetPtr($udr)) EndIf $ret = DllCall ("shell32.dll", "ptr", "SHGetSpecialFolderLocation", _ "int", 0 , "int", $root , "ptr", DllStructGetPtr($ubi, 2) ) If $ret[0] Then Return $res GUIRegisterMsg (1, "_FileSelectFolderOldStyleProc") ; регистрируем событие для перехвата ; Открытие окна выбора каталога $pidl = DllCall ("shell32.dll", "ptr", "SHBrowseForFolder", "ptr", DllStructGetPtr ($ubi)) GUIRegisterMsg (1, "") ; разрегистрируем событие 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 |
Отправлено: 13:00, 10-05-2007 | #389 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27
Цитата:
![]() ![]() Большое спасибо тебе, и автору идеи! |
|
------- Отправлено: 14:45, 10-05-2007 | #390 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Открывая 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 |
|