Войти

Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 [52] 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

morgan1991
28-10-2008, 22:57
спс Creat0R, только не могу понять чё это такое?:
$objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
$objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
If Number($IPPort) = 0 then $IPPort = 25
$objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
;Authenticated SMTP
If $s_Username <> "" Then
$objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
$objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
$objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password
зачем эти ссылки? Захожу по ним а они не рабочие, точнее там пишет типо 404, а код без них не пашет

semiono
28-10-2008, 23:36
Подскажите пжлст, что лучше или в каком случае лучше
winwaitactive("Alcohol","Welcome to the Alcohol") vs winwaitactive("[TITLE:Alcohol; Class:#32770]")

controlclick("Alcohol", "License Agreement", "I &Agree", "left", 1) vs controlclick("Alcohol", "License Agreement", "[Class:Button; Instance:2]", "left", 1)

я так думаю, что буквы хуже из-за кодировок и т.п. однако Title всёравно не напишешь цыфрами, дык тогда уж лучше всё так и вбивать как видно... всёравно приложение всегда конкретное и ситуация всегда предвидима, после многократных тестов проверки... ??

Меня более всего не устраивает сама путаница методов, зачем их так много? И как-то не систематизированно, сколько хелп читаю, всёравно только методом тыка познаётся.

Creat0R
29-10-2008, 00:20
morgan1991, зачем эти ссылки? »
Это вроде как константы, судя по рассуждениям тут (http://forum.sysfaq.ru/index.php?showtopic=9749), на самом деле обращения на сервер MS не происходит (хотя видимо это зависит от тех же настроек).

semiono,
что лучше или в каком случае лучше
Если для себя, то обычное распознавание по заголовкам и тексту вполне подходит. Если нужно надёжно, тогда лучше по классу + заголовок + текст.

не устраивает сама путаница методов, зачем их так много? »
А это со временнем их так набралось :), классы и т.п. не всегда были доступны (в аутоите). Старые методы оставлены в целях обратной совместимости.

сколько хелп читаю, всёравно только методом тыка познаётся »
Ну, оно так почти всегда, справка помагает, подталкивая на нужное направление ;)

semiono
29-10-2008, 01:27
Путаница я имел ввиду в том, что если
winwaitactive("[TITLE:Alcohol; Class:#32770]") достаточно лишь [Title + Class] юзать,
то в controlclick нужен титл разделённый обычным текстом и потом уже класс...
то есть я хотел сначала перейти на полное использование только классов, но ведь так нельзя:

controlclick("[TITLE:Alcohol; Class:#32770]", "????", "[Class:Button; Instance:2]", "left", 1)

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

Если делать не для себя, то возможные проблеммы когда откроется какоенибудь посторонее окно
и Enter улетит в него, однако тут как по тексту, так и по классам всегда можно ошибиться,
так как они повторяются в разных приложениях... ?

Creat0R
29-10-2008, 01:36
semiono,
в controlclick нужен титл разделённый текстом и потом уже класс »
Там не обязательно ставить текст ;)

Если делать не для себя, то возможные проблеммы когда откроется какоенибудь посторонее окно
и Enter улетит в него »
Я лично не долюбливаю функции Send и т.п. (хотя иногда без них никак), вместо бросания Enter'а в окно, лучше узнать класс контроля и нажать по нём, или в крайнем случае активировать окно (и дождаться его активности) перед посыланием.

amel27
29-10-2008, 06:16
Creat0R
Вот так »
Супер!.. я бы на такой код не решился :biggrin: ...к примеру, в Си он является грубой ошибкой - компилятор не обязан соблюдать последовательность выполнения равноправных операндов - т.е. FileExists() вполне может выполниться перед DriveStatus(), поэтому мой вариант был бы другой (ниже)... Но скрипты выполняются "как написано" (всегда ли?) и это позволяет упростить некоторые проверки (контроль @error, IsArray(), etc.)
While 1
$Next = (DriveStatus("A:")=="READY")
If $Next Then $Next = FileExists('A:\gk.db3')
If $Next Then ExitLoop

If MsgBox (36, 'Предупреждение', 'Автоустановка программы, Перед продолжением установки ТРЕБУЕТСЯ вставить в Floppy дисковод,' & _
@CRLF& ' дискету пользователя, в противном случае работа не будет продолжена.' & _
@CRLF& 'Вы хотите продолжать работу?') = 7 Then Exit
Sleep(100)
WEnd

MsgBox(48, "Информация", "Запущена установка программы!")
Старые методы оставлены в целях обратной совместимости. »
не, скорей в целях прямой обучаемости :)

Grammaton Cleric
29-10-2008, 10:27
Супер!.. я бы на такой код не решился ...к примеру, в Си он является грубой ошибкой - компилятор не обязан соблюдать последовательность выполнения равноправных операндов - т.е. FileExists() вполне может выполниться перед DriveStatus(), поэтому мой вариант был бы другой (ниже)... Но скрипты выполняются "как написано" (всегда ли?) и это позволяет упростить некоторые проверки (контроль @error, IsArray(), etc.)

$Next = False
While 1
If DriveStatus("A:")=="READY" Then $Next = True
If $Next Then $Next = FileExists('A:\gk.db3')
If $Next Then ExitLoop
If MsgBox (36, 'Предупреждение', 'Автоустановка программы, Перед продолжением установки ТРЕБУЕТСЯ вставить в Floppy дисковод,' & _
@CRLF& ' дискету пользователя, в противном случае работа не будет продолжена.' & _
@CRLF& 'Вы хотите продолжать работу?') = 7 Then Exit
Sleep(100)
WEnd
MsgBox(48, "Информация", "Запущена установка программы!") »
Хм... я вот не программер, я только учусь.. Тут все, конечно, круто, но вот только я не понимаю смысл этих операций с переменной $next, не в том смысле, что я могу проще, а в том смысле, что "не мог бы ты объяснить?"... При чем, учитывая мою слабую компетентность в этом вопросе, при объяснении прошу использовать стиль "a la" для детсадовца... Не хочется просто использовать данный кусок кода - хочется его понять, для начала.

amel27
29-10-2008, 11:23
"не мог бы ты объяснить?" »
без проблем - у меня лобовой вариант привел к дублированию кода (MsgBox):While 1
If DriveStatus("A:")=="READY" Then
If FileExists('A:\gk.db3') Then
ExitLoop
Else
If MsgBox (36, 'Предупреждение','Автоустановка программы, Перед продолжением установки ТРЕБУЕТСЯ вставить в Floppy дисковод, '&@CRLF& _
'дискету пользователя, в противном случае работа не будет продолжена.'&@CRLF& _
'Вы хотите продолжать работу?') = 7 Then Exit
EndIf
Else
If MsgBox (36, 'Предупреждение','Автоустановка программы, Перед продолжением установки ТРЕБУЕТСЯ вставить в Floppy дисковод, '&@CRLF& _
'дискету пользователя, в противном случае работа не будет продолжена.'&@CRLF& _
'Вы хотите продолжать работу?') = 7 Then Exit
EndIf
Sleep(100)
WEnd

MsgBox(48, "Информация", "Запущена установка программы!")

поэтому я ввел некий флаг $Next, который изначально равен FALSE (aka "красный свет", TRUE - "зеленый"),
далее (с учетом изменений):

- если вставлен диск, то DriveStatus() дает "зеленый", иначе - "красный";
- FileExists() может изменить цвет на "красный", но только с "зеленого" (иначе будет ошибка);
- если после всех проверок "зеленый", то скрипт выходит из цикла и продолжает работу;
- если "красный", то попадаем на предупреждение и далее либо выход из скрипта, либо по циклу до "зеленого"

Creat0R
29-10-2008, 12:43
amel27, FileExists() вполне может выполниться перед DriveStatus() »
Если первое услове истина (True), то второму нет смысла выполняться, т.к условия разделены оператором Or. Также и с оператором "и", если есть два условия через And, и первое не является истиной, то второе не будет выполняться, оно выполняется только если первое условие это True.
Иногда это помагает, а иногда как раз наоборот.

мой вариант был бы другой (ниже) »
Тем то AutoIt мне и нравится, что в нём можно сделать всё предельно просто, но точно также как и сложно :biggrin:

лобовой вариант привел к дублированию кода (MsgBox) »
Не обязательно:


While 1
If DriveStatus("A:") <> "READY" Then
If MsgBox (36, 'Предупреждение', _
'Автоустановка программы, Перед продолжением установки ТРЕБУЕТСЯ вставить в Floppy дисковод, ' & @CRLF & _
'дискету пользователя, в противном случае работа не будет продолжена.' & @CRLF & _
'Вы хотите продолжать работу?') = 7 Then Exit

ContinueLoop
EndIf

If FileExists('A:\gk.db3') Then ExitLoop
WEnd

MsgBox(48, "Информация", "Запущена установка программы!")

Или это не лобовой? :tomato2:

semiono
29-10-2008, 13:58
>Пожалуйста помогите с кодом?
>Надо проверить установлен ли SPTD драйвер и если нет перезагрузить Windows XP.
>Я думаю проверку драйвера можно осуществить проверкой существования файла:
>"%SystemRoot%\system32\drivers\sptd.sys"
>Или есть лучше вариант? (SPTD - это драйвер с которым обычно работает Alcohol)
>Перезагрузку можно выполнить так Run($WinDir"\system32\shutdown.exe", "-f -r -t 00") если я не ошибаюсь?
>Помогите целым куском кода, чтоб сразу вставить в скрипт? Иначе я запутаюсь в IF - логических консрукциях :\
>Ещё возможна трабла, так как я всётаки хочу это установить во время инсталяции windows на t13, может быть тут какие-то ещё есть сложности? Я >вообще-то не уверен перезагрузится ли windows в этой ситуации.
>Но полюбому, хотя бы так нужен скрипт, хотябы обычно юзать.

Ай-ай, я уже сам написал, примерчек:
If FileExists("C:\autoexec.bat") Then
Run("Calc.exe")
Else
Shutdown(6)
EndIf
Только как это грамотно сделать, чтоб Then переходил в основной код, ссылку чтоли тут надо? Как это делают? GoTo чтоль...
Или просто тупо вставить весь код программы между: Then ... Else? Вроде это не по-програмиссткски! :)

Maza Faka
29-10-2008, 15:36
Только как это грамотно сделать, чтоб Then переходил в основной код »
Смотри в справке Func()

Grammaton Cleric
30-10-2008, 04:05
amel27, Creat0R ну в общем-то эти варианты работают... Спасибо за помощь а так как частенько приходится эти файлы на дискетах проверять, наваял себе небольшую функцию...
;_Fileona ('param1', 'param2', 'param3')
;в функцию отравляется название файла... проверяется наличие дискеты и наличие на ней файла
;param1 = имя файла (если указывается путь, то без первого слэша)
;пример: 'test.txt' или, во втором случае, 'mydir\test.txt'
;param2 = Титл окна выдаваемого в случае отстутствия дискеты или файла
;param3 = текст окна выдаваемого в случае отстутствия дискеты или файла
Func _Fileona ($onafile, $onatitle, $onatext)
While DriveStatus ('A:\') <> 'Ready' or Not FileExists ( 'A:\'&$onafile)
if MsgBox ( 36, $onatitle, $onatext&@CRLF&'Вы хотите продолжить?') = 7 Then
ExitLoop
EndIf
WEnd
$onafile = 0
$onatitle = 0
$onatext = 0
EndFunc
Вдруг кому пригодится.
-------
И еще вопрос к amel27 и Creat0R объясните пожалуйста чем "ContinueLoop" отличается от его отстутствия?

amel27
30-10-2008, 04:32
Creat0R
Если первое услове истина »компилятор сам решает какое "первое", какое "второе" - он в курсе, что "от перестановки слагаемых результат не меняется" ;) ... к примеру, из соображений оптимизации он может поставить на выполнение сначала расчет самого короткого (с его точки зрения) условия, а потом длинного... или даже одновременно

Тем то AutoIt мне и нравится »
угу, только надо держать "в уме" это различие

Не обязательно »
твой код не выдаст предупреждения на дискету без файла :tongue:


semiono
Или есть лучше вариант?»
имхо надежней через реестр - например, проверить параметр "Start" ключа "HKLM\System\CurrentControlSet\Services\SPTD", если =1, то драйвер установлен, смотри в справке RegRead()


Grammaton Cleric
чем "ContinueLoop" отличается от его отстутствия? »
ContinueLoop - силовое завершение текщего цикла - т.е. пропускается весь код до конца цикла и управление передается сразу на Next/WEnd/Until, при вложенных циклах можно указать, какой именно цикл мы хотим завершить, по умолчанию =1 (текущий)

Grammaton Cleric
30-10-2008, 05:11
ContinueLoop - силовое завершение текщего цикла... »
Теперь дошло... спасибо за объяснение..
Теперь еще одна непонятка...
$Next = (DriveStatus("A:")=="READY")
If $Next Then $Next = FileExists('A:\gk.db3')
If $Next Then ExitLoop »
Вторая проверка, по моим соображениям, всегда будет успешно выполняться... То есть при любом результате - выход из цикла... почему-то мне кажется, что здесь If $Next Then $Next = FileExists('A:\gk.db3') должно иметь вид If $Next Then $Next = (FileExists('A:\gk.db3')==1) или я не прав?

amel27
30-10-2008, 05:38
If $Next Then $Next = FileExists('A:\gk.db3') должно иметь вид If $Next Then $Next = (FileExists('A:\gk.db3')==1) »
в обоих случаях $Next присвоится 1/True при наличии файла и 0/False при его отсутствии
любое число <>0 обрабатывается при проверке как TRUE, 0 соотвественно FALSE, так что эти варианты эквивалентны

Creat0R
30-10-2008, 13:59
amel27, компилятор сам решает какое "первое", какое "второе" - он в курсе, что "от перестановки слагаемых результат не меняется"
Компилятор? я если честно не вижу связи, компилятор преобразовывает в машинный код, возможно ты имел в виду интерпритатор? :)
И тут мне немного не понятно, что значит он сам решает, тогда получается можно условия написать как угодно? на практике однако это не так...


;Пример 1
If 1 = 1 Or TestFunc() Then MsgBox(0, "", "1 = 1")

;Пример 2
If 1 = 0 And TestFunc() Then MsgBox(0, "", "1 = 0?")

;Эта функция никогда не запустится с условиями выше
Func TestFunc()
Return MsgBox(0, "", "MsgBox from TestFunc()")
EndFunc

твой код не выдаст предупреждения на дискету без файла
А про это сообщение небыло речи :) - Имхо, мой первый вариант самый оптимальный.

ContinueLoop - силовое завершение текщего цикла
Разве? :shuffle: Мне казалось что это продолжение цикла с начала :) Выход это ExitLoop.

$Next = (DriveStatus("A:")=="READY")
If $Next Then $Next = FileExists('A:\gk.db3')
If $Next Then ExitLoop
Вместо этого можно просто If DriveStatus("A:") == "READY" And FileExists('A:\gk.db3') Then ExitLoop :tongue:

amel27
30-10-2008, 15:24
Creat0R
не вижу связи »это я про про алгоритмы вообще и про скрипты vs компиляторы в частности
про это сообщение небыло речи »имхо бессмысленно кричать пользователю о том что нужна дискета и радостно жевать до опупения первую попавшуюся :)
мне казалось что это продолжение цикла с началаподтверждаю, слово "цикл" применил не по назначению, имел ввиду текущий проход цикла
мой первый вариант самый оптимальный »дык потому и отметил полезняшкой ;)
Вместо этого можно просто »зациклились однако :)

Creat0R
30-10-2008, 16:53
amel27, зациклились однако »
Да, пора закругляться :jester:

У меня тут на другую тему есть вопрос: Обязательно ли освобождать разного рода хендлы (типа Callback, FileOpen и т.п.) при выходе из скрипта (OnAutoItExit)?

В справке у FileClose() сказано:

Upon termination, AutoIt automatically closes any files it opened, but calling FileClose is still a good idea.

Возможно это относится и к другим хендлам? И если нет, то что происходит если не закрывать хендлы на выходе, возможно будет излишнее переполнение памяти?

amel27
31-10-2008, 05:49
Обязательно ли освобождать разного рода хендлы »
Те что открыты через API обязательно, через ф-ции AutoIT необязательно (при штатном выходе из скрипта), если скрипт прерывается системой (обычно при тестировании), то хвосты остаются полюбому... помогает только регулярная перезагрузка. :) С другой стороны, для "тяжелых" скриптов полезно своевременно закрывать освободившиеся описатели из соображений экономии ресурсов.

ADD: ИМХО вопрос упирается в поддерживаемые типы данных, примерно так: если для к-либо описателя есть ф-ция типа Is*(), где * - тип описателя, то AutoIT должен уметь сам корректно закрывать такие переменные-описатели... Но если, к примеру, обычная переменная содержит несвойственный ей тип (целое число -> указатель на стуктуру, полученный через API), то тут понятно ответственность полностью на авторе скрипта

Dump
31-10-2008, 06:43
:cool: :jester: :lol: :sorry: :( :o :) :tongue: :help: :lazy: :oszone: :search: :clapping: :beta: :closed-to :read: :yahoo: :drug: :drug: :dont-know :happy: :kiss: :lazy: :help:




© OSzone.net 2001-2012