Показать полную графическую версию : [архив - Часть 2] AutoIt скрипты
If FileExists(@ProgramFilesDir & "\MyProgram\Program.exe") Then
С полным путем получилось!Спасибо огромное :)
amel27, Одно радует - в "классическом" варианте папка всегда открывается. Можешь сам проверить - попробуй в CallBack-функции вместо:
У меня с этой заменой вообще не задаётся начальный каталог в "классическом" стиле :dont-know
хотя первую-то строчку наверное надо оставить?
У меня и без неё всё нормально работает.
P.S
У меня такой вопрос - если я использую новый стиль, а скрипт будет запущен на старой машине (где он не поддерживается, т.е где ещё нету IE 5), что произойдёт с этой функцией? она перейдёт в старый стиль, или сразу вернёт ошибку? или вообще скрипт выпадет? :)
Вот еще ребят!Почему-то не работает время winWaitActive , т.е когда я указываю время:
WinWaitActive ("notepad" , "new document" , 100000)
то если даже через секунду после запуска, я это окно сделаю активным, то все остальные команды, как send enter и т.д уже не работают на этом окне !:)
Maza Faka
07-08-2007, 18:02
spooll
У меня работает:
WinWaitActive("Безымянный - Блокнот", "", 100000)
ControlSend("Безымянный - Блокнот", "", "Edit1", "Hello world")
Проверь правильно ли указан заголовок окна.
spooll
Зачем выставлять сто тысяч секунд? (Обычно 2-3 секунды бывает достаточно.) :)
$ret = WinWaitActive ("Текстовый документ", "" , 3)
If $ret = 1 Then
;~ Send() и т.д
Else
MsgBox(0,"","Команда не дождалась активного окна")
Endif
А лучше не дожидаться активности окна, а активизировать его принудительно:
$ret = WinWait ("Текстовый документ", "" , 3)
If $ret = 1 Then
WinActivate("Текстовый документ","")
Sleep(100)
;~ Send() и т.д
Else
MsgBox(0,"","Окно не существует")
Endif
Maza Faka,
да заголовок тот, то что показал Diamond, вроде подходит, только это придется все перебивать чтоли, чесно я еще не задавал никогда переменные типа $ret
Просто я что хочу, чтобы при утсановки пользователю на комп, он случайно не сбил активность окна, тем самым нарушив работу скрипта, у меня есть вот что:
If FileExists("C:\Program Files\1Cv77\BIN\1CV7s.exe") Then
Exit
Else
Run("\\192.168.11.198\Distrib\1s_install\B770023\Disk1\setup.exe")
WinWaitActive("Добро пожаловать", "Добро пожаловать в программу установки")
Send("{ENTER}")
WinWaitActive("Выбор варианта установки", "Выберите вариант установки программы")
Send("{ENTER}")
WinWaitActive("Информация о пользователе", "Введите Ваше имя и название")
Send("{ENTER}")
WinWaitActive("Информация о пользователе", "Вы сообщили следующую информацию")
Send("{ENTER}")
WinWaitActive("Выбор каталога для установки", "Программа установки поместит 1С")
Send("{ENTER}")
WinWaitActive("Создание нового каталога")
Send("{ENTER}")
WinWaitActive("Выбор программной группы", "Выберите из существующих или")
Send("{ENTER}")
WinWaitActive("Установка 1С:Предприятия", "Программа установки скопировала файлы")
Send("{ENTER}")
WinWaitActive("Установка 1С:Предприятия", "Установка программы 1С")
Send("{ENTER}")
Run("\\192.168.11.198\Distrib\1s_install\B770025\Disk1\setup.exe")
WinWaitActive("Добро пожаловать", "Добро пожаловать в программу установки")
Send("{ENTER}")
WinWaitActive("Список установленных программ", "Из списка найденных на данном компьютере")
Send("{ENTER}")
WinWaitActive("Обновление 1С:Предприятия", "При работе с сетевыми версиями")
Send("{ENTER}")
WinWaitActive("Обновление 1С:Предприятия", "Обновление программы 1С")
Send("{ENTER}")
Run("\\192.168.11.198\Distrib\1s_install\B770025\1C_patch_7725\1Cv77SQL_025_Patch.exe")
WinWaitActive("Патч 1С:Предприятие 7.7.025", "Вы запустили программу")
ControlClick ("Патч 1С:Предприятие 7.7.025", "Вы запустили программу", "Button1")
WinWaitActive("PatchWise Updater")
Send("{ENTER}")
ControlClick ("Патч 1С:Предприятие 7.7.025", "Вы запустили программу", "Button2")
EndIf
Это выходит перед каждой строкой нужно ставить WinActivate +заголовок последующего окно +время в секундах сколько ему ждать?! :) Просто вроде несложная задача и хотелось бы сначала попроще . Спасибо что помогаете.
Maza Faka
07-08-2007, 19:16
spooll
Это выходит перед каждой строкой нужно ставить WinActivate
Нет. Вставь в начало скрипта BlockInput(1) а в конец скрипта BlockInput(0) пока приложение не установится, ввод будет заблокирован.
spooll,
чтобы при утсановки пользователю на комп, он случайно не сбил активность окна
Советую использовать вместо Send() - ControlSend(), ну или ControlClick(), это действует даже для не активных окон.
Можно ещё поставить на выполнение чтобы все окна постоянно сворачивалось (хотя не идеальный вариант):
AdlibEnable("MinimizeWindows", 100)
Func MinimizeWindows()
WinMinimizeAll()
EndFunc
а потом в конце восстановить всё:
WinMinimizeAllUndo()
Как можно узнать заголовок окна сохранения?
На каждой системе, в зависимости от язка системы, этот заголовок будет разным, на английской к примеру Save As, на русской Сохранить как, а как быть с системами на других языках? может можно как то получить это имя с конфигов системы? где оно всё хранится?
Creat0R
У меня с этой заменой вообще не задаётся начальный каталог в "классическом" стиледык в классике она и не нужна - там каталог, выбранный по $BFFM_SETSELECTION итак открывается, а в "новом стиле" выбирается но остается закрытым и если нужен файл приходится кликать плюсик... Кстати, это сообщение не поддерживается не только старым стилем, но и Windows 2000.
У меня и без неё всё нормально работаетхм... у меня тоже, тогда уберу... попозжа
если я использую новый стиль, а скрипт будет запущен на старой машине (где он не поддерживается, т.е где ещё нету IE 5), что произойдёт с этой функцией? она перейдёт в старый стиль, или сразу вернёт ошибку? или вообще скрипт выпадет?Если рассуждать логически, то отсутствие поддержки "нового стиля" равносильно отсутствию поддержки флага $BIF_NEWDIALOGSTYLE, из чего следует что должен отработать старый стиль. Кстати, для проверки версии достаточно вернуть версию "comctl32.dll", линк: http://msdn2.microsoft.com/en-us/library/ms649534.aspx
На заметку. Незадействованные возможности SHBrowseForFolder():
- сообщение $BFFM_SETEXPANDED. По ходу толку от него мало, так как работает глючно (у меня).
- сообщение $BFFM_VALIDATEFAILED. Имеет смысл только при использовании поля редактирования (флаг $BIF_EDITBOX), можно к примеру выводить текст предупреждения или затенять "Ок" если набран несуществующий путь.... реализуется просто, вот только надо ли?
- сообщение $BFFM_SETOKTEXT, поддержка минимальная (только для $BIF_RETURNONLYFSDIRS), для расширенной проверки атрибутов выбранного элемента придется ваять свой вариант CallBack-функции (как в _MyFSFCallbackProc)... либо нужно сочинять свой набор флагов и через него передавать какие типы нам нужны;
- есть возможность по ходу возвращать код картинки (иконки) выбранного элемента;
- есть возможность фильтрации отображаемых элементов, это более мощное средство чем затенение "Ок", но средствами одного скрипта нереализуемо, т.к. нужно создавать свой COM-объект.... как варианты: 1) использовать DLL, 2) использовать скрипты WSH. Первый сложней в реализации, но быстрей, второй - проще (через VBS-скрипт), но дюже медленный.... особенно если учесть, что объект будет вызываться для КАЖДОГО элемента списка.
Как можно узнать заголовок окна сохранения?интересно, зачем?... это внешнее окно или AutoIT-овское?... логично предположить, что в comdlg32.dll ;)
ADD: DLL тоже не гарантия - если на английский WIN накатить MUI (к примеру - русский), то текст заголовка будет взят из файла \WINDOWS\MUI\FallBack\0419\comdlg32.dll.mui
Maza Faka,
:laugh:
Я конечно подозревал, но всеравно запустил скрипт с BlockInput(1)
естественно, при любой ошибке или просто косяке (у меня например почему-то не прошло окно выбора каталога установки) у меня все заблокировалось и пришлось жать ресет =)))
Как сделать чтобы допустим при заминки или просто не выполнения скрипта, блок снимался? :)
spooll
Как сделать чтобы допустим при заминки или просто не выполнения скрипта, блок снимался?
Нужно чтобы скрипт достиг конца и выполнил команду BlockInput(0).
Другой вопрос, почему этого не происходит? - Причин может быть несколько, вот одна из них: Если в WinWaitActive() или WinWait() время ожидания не указано или указан 0, то в случае ошибки, ожидание будет бесконечным.
То есть если имеем
BlockInput(1)
Run("\\192.168.11.198\Distrib\1s_install\B770023\Disk1\setup.exe")
WinWaitActive("Добро пожаловать", "Добро пожаловать в программу установки")
Send("{ENTER}")
WinWaitActive("Выбор варианта установки", "Выберите вариант установки программы")
Send("{ENTER}")
BlockInput(0)
То если к WinWaitActive добавить 10сек к примеру, то скрипт останавливится в случае простоя?
spooll
Тогда WinWaitActive подождёт 10 секунд и затем перейдёт к следующей команде , а если WinWaitActive дождалась активного окна раньше 10 секунд, то переход произойдёт сражу же.
Добавлено:
Например можно заключит всё это в функцию, чтобы в случае ошибки выйти из неё.
test()
Func test()
BlockInput(1)
Run("\\192.168.11.198\Distrib\1s_install\B770023\Disk1\setup.exe")
$ret=WinWaitActive("Добро пожаловать", "Добро пожаловать в программу установки",10)
If $ret Then
Send("{ENTER}")
Else
BlockInput(0)
Return ; Выход из функции
EndIf
$ret=WinWaitActive("Выбор варианта установки", "Выберите вариант установки программы",10)
If $ret Then
Send("{ENTER}")
Else
BlockInput(0)
Return ; Выход из функции
EndIf
EndFunc
Maza Faka
08-08-2007, 14:28
spooll, Как сделать чтобы допустим при заминки или просто не выполнения скрипта, блок снимался?
Волшебное сочетание клавиш: Ctrl + Alt + Delete :-)
Diamond, спасибо за пример, переделал весь скрипт, немогу протестить как он поведет в случае ошибки, но все прошло гладко. Надеюсь завтра с утра мне не посыпятся звонки :)
И еще, я так понял, т.к AutoIT работает с активными окнами, то тихую установку без известия пользователя не сделать!Так ведь? Типа как параметр /quiet у msi пакетов?! :dont-know
Maza Faka
08-08-2007, 15:03
Case $msg = $playlist
$m3u = FileOpenDialog("Add playlist", "", "Playlist (*.m3u)", 1)
If @error Then ContinueLoop
_FileReadToArray($m3u, $m3u_array)
$sound = _SoundOpen($m3u_array[1])
_SoundPlay($sound)
Если в плейлисте прописаны пути к mp3-файлам, которые находятся в каталоге откуда запускается скрипт, то файлы проигрываются, если прописаны пути к mp3-файлам которые находятся в другом каталоге, то не проигрываются, как я понял, игнорируются пути, почему?
Блин, чегойто я натворил непонятно, только все работало...
$ret=WinWaitActive("Создание нового каталога", 20)
If $ret Then
Send("{ENTER}")
Else
BlockInput(0)
Return ; Выход из функции
EndIf
$ret=WinWaitActive("Выбор программной группы", "&Папки с Программами:", 10)
If $ret Then
Send("{ENTER}")
Else
BlockInput(0)
Return ; Выход из функции
EndIf
Когда появляется окно с "Выбор программной группы", то enter не жмется и блок не снимается, как-будто он жмет enter раньше окна, но судя по скрипту такого быть не может =( Что можно сделать? ControlClick и ControlSend пробовал!
PS.Попробовал навсякий на нескольких компах, прежде чем установить скрипт в автозапуск, оказалось что на разных машинах, скриптзастревает в разных местах, хотя у кого-то проходит сразу!, также не отключается блокировка и т.д.Везде поставил время WinWaitActive 20, но всеравно виснет.Подскажите, очень нужно !
Некоторое время назад здесь приводился скрипт, для отключения монитора. Я его запустил, да только при любом шевелении мышкой или клавиатурой монитор включается! Как сделать так, чтобы монитор включался ТОЛЬКО по горячей клавише. Хочется управлять винампом горячими клавишами клавиатуры не включая монитор.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.