[Архив - Часть 1.2] AutoIt скрипты

Ответить
 • Просмотры: 3
Аватара пользователя
Creat0R

Re: [Архив - Часть 1.2] AutoIt скрипты

Сообщение Creat0R »

Creat0R

Если речь про функцию MyErrFunc () то она построена некорректно, посуди сам что выходит: если ошибку вызвал модуль "WinHttp.WinHttpRequest" - устанавливаем только код ошибки и ничего не возвращаем, а если любой другой - только возвращаем текст ошибки... Если скрипт не отслеживает другие возможные ошибки кроме HTTP и тебе нужен не только номер, но и текст ошибки лучше сделать иначе

Код:

Код: Выделить всё

;Установка функции перехвата COM-ошибок
$oMyError = ObjEvent("AutoIt.Error","MyErrFunc")
; ...
;Обработчик COM-ошибок
Func MyErrFunc()
    SetError($oMyError.number)
    Return $oMyError.description
Endfunc

... Хотя учитывая, что с одной стороны эта функция единственная для всех возможных событий, а с другой - коды ошибок для любого модуля вполне известны, ключевой информацией является не текст ошибки, а ее номер и источник. Исходя из этой инфы и строятся обработчики ошибок - внутри самой функции MyErrFunc () или в других местах...



P.S. шалость удалась (c) Изображение ... конечно скриптом - больше ради прикола чем по необходимости,

заодно разобрался с тегами форума и погонял функции StringRegExp*, если есть интерес то могу запостить...

на самом деле все гораздо проще чем кажется. Изображение
Аватара пользователя
amel27

Re: [Архив - Часть 1.2] AutoIt скрипты

Сообщение amel27 »

Creat0R

опечатку исправил... только почему-то на моем компе она перестала работать - вываливает ошибку таймаута и все тут, хотя точно знаю что все работало!... уже и PROXYCFG проверил - ничего не помогает... ладно, сейчас некогда ковыряться может позже разберусь в чем причина.
Цитата:



если @error = 1, значит вывожу сообщение (не в функции, а в теле скрипта), и в нём сообщаю о том какая ошибка произошла (значение ошибки должно тоже возвращаться из функции)



Обычно делается так: в норме функция возвращает "0" или там еще что по контексту, если ошибка то "-1" или типа того, при необходимости номер ошибки можно восстановить через @error. Это особенно удобно если функция по задумке должна возвращать полезную информацию - в этом случае возможности передать тип ошибки весьма ограничены...
Аватара пользователя
Creat0R

Re: [Архив - Часть 1.2] AutoIt скрипты

Сообщение Creat0R »

amel27

Если я сделаю так (см. ниже), будет ли это являться корректной проверкой подключения?





Код:

Код: Выделить всё

;Установка функции перехвата COM-ошибок
 $oMyError = ObjEvent("AutoIt.Error","MyErrFunc")
 If IsNotConnect() Then MsgBox (48,"Проверка связи","Интернет-соединение отсутствует по причине:" & @CRLF & $oMyError.description)
;Функция проверки на отсутствие соединения
 Func IsNotConnect()
    Local $oHTTP=ObjCreate("winhttp.winhttprequest.5.1")
    $oHTTP.Open("GET","http://www.google.com")
    $oHTTP.Send()
    Return @error
 EndFunc
;Обработчик COM-ошибок
Func MyErrFunc()
    Select
        Case $oMyError.source = "WinHttp.WinHttpRequest"
            SetError($oMyError.number)
        Case Else
            Return $oMyError.description
    EndSelect
Endfunc



P.S:



Просто интересно, как ты разукрасил код скрипта? Изображение неужели каждую команду (и разделители) обрамлял тегом цветов и выделения?
Аватара пользователя
Creat0R

Re: [Архив - Часть 1.2] AutoIt скрипты

Сообщение Creat0R »

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)
Аватара пользователя
amel27

Re: [Архив - Часть 1.2] AutoIt скрипты

Сообщение amel27 »

Creat0R

По поводу раскраски кода (поскольку это решение на AutoIT то имхо не оффтоп) ... Замечу, что лобовое решение требует последовательного разбора всего текста кода по словарю, а это слишком большой объем работ... Но зачем изобретать велосипед, если SciTE4 уже делает это и весьма успешно? Одна из его возможностей - экспорт кода в HTML/XML-формат с сохранением всех стилей, осталось только определить соответствия между стилями XML и форума и произвести замену. Поэтому обработка проходит в два шага: экспорт кода в XML-файл и последующая обработка его скриптом - содержимое полученного TXT-файла (уже с тегами кода) можно публиковать в форуме. Поскольку текст скрипта напичкан всевозможными тегами вынужден прикрепить его отдельным файлом...



P.S. Как видно из текста скрипта я определил еще не все стили (например пропущены 2, 10, 12, 13) и наверняка не все спецсимволы... они мне просто еще не попадались, на этот случай я оставил проверку на полноту замены... если кто обнаружит их раньше просьба сообщить в личку.



линк:
http://www.sendspace.com/file/wjwk9r


--------

нормальные герои всегда идут в обход (c) Изображение
Вложения
Au3ToOSZonePst.7z
(1.27 КБ) 0 скачиваний
Au3ToOSZonePst.7z
(1.27 КБ) 0 скачиваний
Аватара пользователя
Creat0R

Re: [Архив - Часть 1.2] AutoIt скрипты

Сообщение Creat0R »

amel27

Файл не скачивается Изображение - т.е скачивается, но архиватор ругается на то что архив повреждён... может зальёшь на
http://www.sendspace.com/
- и\или мне на мыло?
Аватара пользователя
Lodoss

Re: [Архив - Часть 1.2] AutoIt скрипты

Сообщение Lodoss »

Отвечаю на повторяющийся по мылу вопрос. Итак, "Как же определить букву дисковода по маркерному файлу?"Способ "В лоб":

Код:

Код: Выделить всё

$TagFile="маркерный файл"
$i = 67
While FileExists( Chr($i) & ":\" & $TagFile )=0 AND $i<=90
    $i = $i + 1
WEnd
;искомый дисковод (буква с двоеточием)
$drive=$i & ":"

Способ "В лоб, но с размышлением Изображение":

Код:

Код: Выделить всё

$TagFile="маркерный файл"
;на какого типа дисководах искать маркерный файл
;возможные варианты: "ALL", "CDROM", "REMOVABLE", "FIXED", "NETWORK", "RAMDISK", или "UNKNOWN"
$type="CDROM"
$drvlst=DriveGetDrive ( $type )
If not @error Then
    For $i = 1 to $drvlst[0]
        If FileExists( $drvlst[$i] & "\" & $TagFile ) Then
            ;искомый дисковод (буква с двоеточием)
            $drive=$drvlst[$i]
            ExitLoop
        EndIf
    Next
EndIf

Ес-но, это далеко не все возможные варианты. В зависимости от исходных данных, для решения подобной задачи, весьма полезными могут оказаться ф-ции DriveGetLabel[/i], DriveGetFileSystem, DriveGetSerial, DriveGetType, DriveStatus.
Аватара пользователя
Lodoss

Re: [Архив - Часть 1.2] AutoIt скрипты

Сообщение Lodoss »

2amel27


Цитата:



Зато теперь можно смело замахнуться на всю линейку NetApi32



(страница 44)

весь сыр бор был из-за 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
Аватара пользователя
Creat0R

Re: [Архив - Часть 1.2] AutoIt скрипты

Сообщение Creat0R »

Lodoss


Цитата:



третий пункт не выполняется



Что значит не выполняется? не выводится сообщение?



Вот немного изменил - добавил проверку (отдельную) на проавильность ввода пароля (это при условии что пароль заранее известен):





Код:

Код: Выделить всё

#include 
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

Re: [Архив - Часть 1.2] AutoIt скрипты

Сообщение Creat0R »

amel27

Класный скрипт, как видно в посте чуть выше, я его уже приминил Изображение - Я тут немного повазился, и немного автоматизировал этот процесс, так что вот,
залил
Изображение



Изображение



ПРИМЕЧАНИЕ: После завершения обработки, в первую и вторую строку самого скрипта, прописываются пути к файлу обработки (*.xml) и к выходному файлу (*.txt), и при повторном запуске скрипта, эти значения будут подставляться в соответствующие поля, так что эти строки лучше не трогать (для удобства).



Можно было бы ещё лучше автоматизировать этот процесс, если бы можно было автоматичкский экспортировать указанный скрипт в *.xml формат - может можно как то задать параметры для SciTE, чтобы там в тихом режиме указанный файл экспортировался в нужный формат? Тогда можно было бы сразу указывать скрипт (*.au3), и всё бы происходило автоматом - минимальное вмешательство юзера Изображение
Ответить

Вернуться в «AutoIt»