|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 1.2] AutoIt скрипты |
|
[Архив - Часть 1.2] AutoIt скрипты
|
Ветеран Сообщения: 565 |
Внимание! Тема переведена в архивное состояние (настоятельно рекомендуется к прочтению/поиску) Руководство к действию по работе c AutoIt. |
|
------- Отправлено: 10:47, 10-02-2006 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Если речь про функцию MyErrFunc () то она построена некорректно, посуди сам что выходит: если ошибку вызвал модуль "WinHttp.WinHttpRequest" - устанавливаем только код ошибки и ничего не возвращаем, а если любой другой - только возвращаем текст ошибки... Если скрипт не отслеживает другие возможные ошибки кроме HTTP и тебе нужен не только номер, но и текст ошибки лучше сделать иначе ;Установка функции перехвата COM-ошибок $oMyError = ObjEvent("AutoIt.Error","MyErrFunc") ; ... ;Обработчик COM-ошибок Func MyErrFunc() SetError($oMyError.number) Return $oMyError.description Endfunc P.S. шалость удалась (c) ![]() заодно разобрался с тегами форума и погонял функции StringRegExp*, если есть интерес то могу запостить... на самом деле все гораздо проще чем кажется. ![]() |
Отправлено: 06:21, 14-11-2006 | #471 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27
В принципе, мне не нужен код ошибки, нужно только описание, т.е если и была ошибка (не важно какая), то нужно сообщать что она была, и по возможности выводить описание этой самой ошибки. И как я понял, используя пример из кода твоего поста (последнего), это оптимальное решение. Если честно, я смутно понимаю всю работу этой функции, для меня вообще много что связанно с интернетом, пока не очень ясно, я в сети не более полу года нахожусь, и тем более что тут не только о самих понятиях интернета идёт речь, но ещё и о модулях, о которых я только начинаю что то узнавать. Цитата:
![]() $File = @ScriptFullPath $FileContent = FileRead($File, FileGetSize($File)) $Result = StringRegExpReplace($FileContent, "[=]", "[color=red]=[/color]") $Result = StringRegExpReplace($Result, "[(]", "[color=red]([/color]") $Result = StringRegExpReplace($Result, "[)]", "[color=red])[/color]") $Result = StringRegExpReplace($Result, "[.]", "[color=red].[/color]") $Result = StringRegExpReplace($Result, "[,]", "[color=red],[/color]") $Result = StringRegExpReplace($Result, "[&]", "[color=red]&[/color]") MsgBox(0, "", $Result) FileWrite($File & ".res", $Result) |
|
------- Последний раз редактировалось Creat0R, 14-11-2006 в 08:29. Причина: Правка кода Отправлено: 08:25, 14-11-2006 | #472 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
По поводу раскраски кода (поскольку это решение на AutoIT то имхо не оффтоп) ... Замечу, что лобовое решение требует последовательного разбора всего текста кода по словарю, а это слишком большой объем работ... Но зачем изобретать велосипед, если SciTE4 уже делает это и весьма успешно? Одна из его возможностей - экспорт кода в HTML/XML-формат с сохранением всех стилей, осталось только определить соответствия между стилями XML и форума и произвести замену. Поэтому обработка проходит в два шага: экспорт кода в XML-файл и последующая обработка его скриптом - содержимое полученного TXT-файла (уже с тегами кода) можно публиковать в форуме. Поскольку текст скрипта напичкан всевозможными тегами вынужден прикрепить его отдельным файлом... P.S. Как видно из текста скрипта я определил еще не все стили (например пропущены 2, 10, 12, 13) и наверняка не все спецсимволы... они мне просто еще не попадались, на этот случай я оставил проверку на полноту замены... если кто обнаружит их раньше просьба сообщить в личку. линк: http://www.sendspace.com/file/wjwk9r -------- нормальные герои всегда идут в обход (c) ![]() |
Последний раз редактировалось amel27, 30-09-2007 в 09:20. Причина: обновил скрипт и линк Отправлено: 10:31, 14-11-2006 | #473 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27
Файл не скачивается ![]() |
------- Отправлено: 00:25, 15-11-2006 | #474 |
Ищу Человека… Сообщения: 420
|
Профиль | Сайт | Отправить PM | Цитировать Отвечаю на повторяющийся по мылу вопрос. Итак, "Как же определить букву дисковода по маркерному файлу?"
|
------- Отправлено: 01:48, 15-11-2006 | #475 |
Новый участник Сообщения: 35
|
Профиль | Отправить PM | Цитировать 2amel27
Цитата:
весь сыр бор был из-за GUI авторизации запуска от имени админа. повторю задачу: 1.Требуется запустить какой либо setup.exe, если пользователь не админ - нарисовать GUI с полем имени и пароля для авторизации запуска (конечно можно воспользоваться стандартным запуском нажав shift но хочется реализовать задачу при помощи AutoIt) 2.В комбо боксе приводим список учёток обладающими правами для установки т. е. админов 3.При неправильном вводе пароля - выдать сообщение об ошибке НЕ закрыв GUI повторю код #include <GUIConstants.au3> Opt("RunErrorsFatal",0) ;что запускать $what_to_run="setup.exe" If IsAdmin() Then ;запуск программы Run($what_to_run) Else ;если не админ, то "рисуем" GUI _GUI() EndIf Func _GUI() GUICreate("Авторизация", 198, 125) ;фон окна GUISetBkColor (0x00E0FFFF) ;лейблы GUICtrlCreateLabel("Имя администратора", 25, 5) GUICtrlCreateLabel("Пароль администратора", 25, 50) ;запуск и отмена скрипта $ok = GUICtrlCreateButton("Ok", 25, 98, 70,20) $cancel = GuiCtrlCreateButton ("Cancel",105,98,70,20) ;ввод имени $us = @UserName $in1 =GUICtrlCreateCombo ($us, 25, 25, 150, 20) GUICtrlSetData($in1, "admin|qwerty|Администратор|Винни-Пух") GUICtrlSetTip(-1,"введите имя любой учётной записи" & @CRLF & "имеюшей права Администратора") ;ввод пароля $in2 = GUICtrlCreateInput ("solo11", 25, 70, 150, 20, 0x20) GUICtrlSetTip(-1,"введите пароль") GUISetState(@SW_SHOW) While 1 $msg = GUIGetMsg() ;считываем введённые данные $out1 = GUICtrlRead($in1) $out2 = GUICtrlRead($in2) Global $user = $out1, $pass = $out2 Select Case $msg = $ok ;инициализация запуска от имени админа RunAsSet($user, "", $pass) ;проверка верны ли введённые записи на право обладания правами админа if IsAdmin() Then ;запуск программы Run($what_to_run) If @error Then MsgBox(16, "Ошибка", "Введен неправильный пароль или отсутствует файл "&$what_to_run&@LF&@LF&"Попробуйте еще раз.",5) EndIf EndIf ;закрытие окна Case $msg = $cancel ExitLoop Case $msg = $GUI_EVENT_CLOSE ExitLoop EndSelect WEnd EndFunc ![]() PS с оболочками только только начал разбираться, многое не понимаю. Помогите PLS |
|
Последний раз редактировалось Lodoss, 16-11-2006 в 18:22. Отправлено: 18:05, 16-11-2006 | #476 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Lodoss
Цитата:
Вот немного изменил - добавил проверку (отдельную) на проавильность ввода пароля (это при условии что пароль заранее известен): #include <GUIConstants.au3> Opt("RunErrorsFatal",0) ;что запускать $what_to_run="setup.exe" If Not IsAdmin() Then ;запуск программы Run($what_to_run) Else ;если не админ, то "рисуем" GUI _GUI() EndIf Func _GUI() GUICreate("Авторизация", 198, 125) ;фон окна GUISetBkColor (0x00E0FFFF) ;лейблы GUICtrlCreateLabel("Имя администратора", 25, 5) GUICtrlCreateLabel("Пароль администратора", 25, 50) ;запуск и отмена скрипта $ok = GUICtrlCreateButton("Ok", 25, 98, 70,20) $cancel = GuiCtrlCreateButton ("Cancel",105,98,70,20) ;ввод имени $us = @UserName $in1 =GUICtrlCreateCombo ($us, 25, 25, 150, 20) GUICtrlSetData($in1, "admin|qwerty|Администратор|Винни-Пух") GUICtrlSetTip(-1,"введите имя любой учётной записи" & @CRLF & "имеюшей права Администратора") ;ввод пароля $in2 = GUICtrlCreateInput ("solo11", 25, 70, 150, 20, 0x20) GUICtrlSetTip(-1,"введите пароль") GUISetState(@SW_SHOW) While 1 $msg = GUIGetMsg() ;считываем введённые данные $out1 = GUICtrlRead($in1) $out2 = GUICtrlRead($in2) Global $user = $out1, $pass = $out2 Select Case $msg = $ok ;инициализация запуска от имени админа RunAsSet($user, "", $pass) ;проверка верны ли введённые записи на право обладания правами админа If IsAdmin() Then ;проверка правильноти пароля If $pass <> "solo11" Then MsgBox(16, "Ошибка", "Введен неправильный пароль"&@LF&@LF&"Попробуйте еще раз.",5) ContinueLoop EndIf ;запуск программы Run($what_to_run) If @error Then MsgBox(16, "Ошибка", "Отсутствует файл "&$what_to_run&@LF&@LF&"Попробуйте еще раз.",5) ContinueLoop EndIf EndIf ;закрытие окна Case $msg = $cancel or $msg = $GUI_EVENT_CLOSE ExitLoop EndSelect WEnd EndFunc |
|
------- Последний раз редактировалось Creat0R, 16-11-2006 в 21:08. Причина: Косметика кода ;) Отправлено: 19:57, 16-11-2006 | #477 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27
Класный скрипт, как видно в посте чуть выше, я его уже приминил ![]() ![]() ![]() ПРИМЕЧАНИЕ: После завершения обработки, в первую и вторую строку самого скрипта, прописываются пути к файлу обработки (*.xml) и к выходному файлу (*.txt), и при повторном запуске скрипта, эти значения будут подставляться в соответствующие поля, так что эти строки лучше не трогать (для удобства). Можно было бы ещё лучше автоматизировать этот процесс, если бы можно было автоматичкский экспортировать указанный скрипт в *.xml формат - может можно как то задать параметры для SciTE, чтобы там в тихом режиме указанный файл экспортировался в нужный формат? Тогда можно было бы сразу указывать скрипт (*.au3), и всё бы происходило автоматом - минимальное вмешательство юзера ![]() |
------- Отправлено: 00:20, 17-11-2006 | #478 |
Новый участник Сообщения: 35
|
Профиль | Отправить PM | Цитировать Цитата:
Это я тут в комбо списке написал "Администратор,admin.....так не должно быть. решение КАК выдать список учёток обладающими правами админа есть от amel27 (осталось только разобраться как это привинтить к комбо списку пользователей %) ) а пароль должен ввести только админ. Цитата:
1.заходим под обычным пользователем в систему если вводим правильные данные (админа)- запускается сценарий run("setup.exe").... 2.если вводим неправильный пароль то выдаётся сообщение "ошибка" и предлагается ввести пароль заново в существующем сценарии ошибка выдаётся даже если правильно ввёл пароль и файл setup.exe существует либо вообще ничего не происходит по нажатии кнопки ОК |
||
Отправлено: 06:17, 17-11-2006 | #479 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Lodoss
Вот рабочий (у меня) вариант (в нём уже включено помещение списка юзеров в combo) : #include <Array.au3> #include <GUIConstants.au3> Opt("RunErrorsFatal",0) ;Узнаём список пользователей $admins = _AdminUsers() Dim $AdminList ;Подготавливаем список пользователей для использования в combo If IsArray($admins) Then For $i = 1 to $admins[0] Do $AdminList = $admins[$i] & "|" & $AdminList Until $admins[$i] <> $admins[0] Next EndIf ;что запускать $what_to_run="setup.exe" If IsAdmin() Then ;запуск программы Run($what_to_run) Else ;если не админ, то "рисуем" GUI _GUI() EndIf Func _GUI() GUICreate("Авторизация", 198, 125) ;фон окна GUISetBkColor (0x00E0FFFF) ;лейблы GUICtrlCreateLabel("Имя администратора", 25, 5) GUICtrlCreateLabel("Пароль администратора", 25, 50) ;запуск и отмена скрипта $ok = GUICtrlCreateButton("Ok", 25, 98, 70,20) $cancel = GuiCtrlCreateButton ("Cancel",105,98,70,20) ;ввод имени $us = @UserName $in1 =GUICtrlCreateCombo ($us, 25, 25, 150, 20) GUICtrlSetData($in1, $AdminList) GUICtrlSetTip(-1,"введите имя любой учётной записи" & @CRLF & "имеюшей права Администратора") ;ввод пароля $in2 = GUICtrlCreateInput ("", 25, 70, 150, 20, 0x20) GUICtrlSetTip(-1,"введите пароль") GUISetState(@SW_SHOW) While 1 $msg = GUIGetMsg() ;считываем введённые данные $User = GUICtrlRead($in1) $Password = GUICtrlRead($in2) Select Case $msg = $ok ;Проверка был ли введён пароль вообще If $Password = "" Then MsgBox(48, "Ошибка", "Не был введён пароль") ContinueLoop EndIf ;инициализация запуска от имени админа RunAsSet($User, "", $Password) ;проверка верны ли введённые записи на право обладания правами админа If IsAdmin() Then ;запуск программы Run($what_to_run) If @error Then MsgBox(16, "Ошибка", "Введен неправильный пароль или отсутствует файл "&$what_to_run&@LF&@LF&"Попробуйте еще раз.",5) ContinueLoop EndIf Exit EndIf ;закрытие окна Case $msg = $cancel or $msg = $GUI_EVENT_CLOSE ExitLoop EndSelect WEnd EndFunc ; Возвращает массив со счетчиком - состав локальной группы "Администраторы" Func _AdminUsers() Local $i, $res [1] = [0] ; читаем состав группы Local $members = _NetLocalGroupGetMembers (@ComputerName, 'Администраторы') ; проверка на ошибки If @error Then MsgBox (16, 'Ошибка выполнения', 'Код ошибки:' & @error) Exit EndIf If $members [0] >0 Then ; фильтруем только локальные учетные записи For $i=1 To $members [0] If StringRegExp ($members [$i], '^' & @ComputerName & '\\') Then ReDim $res [$res[0]+2] $res [0] = $res [0]+1 $res [$res[0]] = StringRegExpReplace ($members [$i], '^' & @ComputerName & '\\', '') EndIf Next EndIf Return $res EndFunc ; Возвращает массив со счетчиком- состав локальной группы произвольного компьютера Func _NetLocalGroupGetMembers($server, $group) Local $i, $string, $res [1] = [0], $pointer= DllStructCreate ("ptr") ; Выполняем запрос к базе SAM Local $ret = DllCall ("netapi32.dll", "int", "NetLocalGroupGetMembers", _ "wstr", "\\" & StringRegExpReplace ($server, '^\\+', ''), _ "wstr", $group, _ "int", 3, _ "ptr", DllStructGetPtr ($pointer), _ "int", -1, _ "int_ptr", 0, _ "int_ptr", 0, _ "int_ptr", 0 ) ; Если произошла ошибка, то выход с кодом ошибки If $ret[0]>0 Then SetError ($ret) Exit EndIf ; Если есть результат, то обрабатываем каждый отдельно If $ret[6]>0 Then Local $buffer = DllStructCreate ("ptr[" & $ret[6] & "]", DllStructGetData ($pointer,1) ) For $i=1 To $ret[6] $ret = DllCall("kernel32.dll", "int", "WideCharToMultiByte", _ "int", 0, _ "int", 0, _ "ptr", DllStructGetData ($buffer, 1, $i), _ "int", -1, _ "str", "", _ "int", 0, _ "int", 0, _ "int", 0 ) $string = DllStructCreate("char[" & $ret[0] & "]") $ret = DllCall("kernel32.dll", "int", "WideCharToMultiByte", _ "int", 0, _ "int", 0, _ "ptr", DllStructGetData ($buffer, 1, $i), _ "int", -1, _ "ptr", DllStructGetPtr ($string), _ "int", $ret[0], _ "int", 0, _ "int", 0 ) ReDim $res [$res[0]+2] $res [0] = $res [0]+1 $res [$res[0]] = DllStructGetData ($string,1) Next EndIf ; Чистим временные системные структуры DllCall ("netapi32.dll", "int" ,"NetApiBufferFree", _ "ptr" , DllStructGetData ($pointer,1) ) Return $res EndFunc |
Отправлено: 09:34, 17-11-2006 | #480 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Открывая 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.3] AutoIt скрипты | biork | AutoIt | 503 | 09-06-2007 11:27 | |
[Архив - Часть 1.1] AutoIt скрипты | EgOrus | AutoIt | 335 | 04-02-2006 16:58 |
|