Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » AutoIT (Часть 3)

Модерирует : gyra, Maz

gyra (23-01-2020 10:51): AutoIT (Часть 4)  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

   

Widok



Moderator-Следопыт
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

 
Описание:

Цитата:
AutoIt v3 - это язык для написания сценариев, напоминающий BASIC. Основным его назначением является автоматизация работ с Windows GUI (графическим интерфейсом пользователя MS Windows). Для выполнения этой сложной задачи предоставляется комбинация испытанных методов, включающих в себя эмуляцию нажатий комбинаций клавиш клавиатуры, перемещения указателя мыши, управление окнами и их визуальными элементами. Как показывает практика, эти "приводные ремни" весьма эффективны для получения работающих решений в ситуациях, когда другие стандартные средства (например, VBScript и SendKeys) оказываются бессильны.
Умеет он очень и очень многое! Бесплатный.

 
  • Справки
  • Инструменты
  • Ресурсы, посвящённые AutoIt
  • Полезные советы новичкам и не только
  • Готовые решения
  • Скрипт раскраски кода AutoIt для публикации в форумах
     


     
    За шапкой следит ViSiToR / AZJIO  

  • Всего записей: 24190 | Зарегистр. 07-04-2002 | Отправлено: 13:07 01-06-2010 | Исправлено: Maz, 12:29 10-01-2020
    dialmak



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Skif_off

    Цитата:
    InstallPath="%TEMP%"  

    Это лишнее. По умолчанию будет запуск после распаковки в TEMP.

    Цитата:
    RunProgram="%TEMP%\\MyProgramAutoIt.exe "%%S\""

    Зачем? Если сделать

    Код:
    ;!@Install@!UTF-8!  
    SetEnvironment="exepath=%%S"  
    RunProgram="my.exe"  
    ;!@InstallEnd@!

    то из скрипта my.exe прочитать переменную %exepath% через Autoit

    Код:
    $sPathEXE = EnvGet("exepath")
    MsgBox(4096, "Значение %exepath%:", $sPathEXE)

    Всего записей: 14007 | Зарегистр. 27-04-2013 | Отправлено: 18:23 29-05-2014
    GORA2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вариант от dialmak корректный, в варианте от Skif_off необходимо поправить вторую строку:

    Код:
    RunProgram="MyProgramAutoIt.exe \"%%S\""

     
    %TEMP% вначале строки удалена по двум причинам:
    1 Она не требуется, т.к. %TEMP% в данном случае текущая папка
    2 Она может содержать пробел и тогда нужно заключать путь в кавычки.

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 18:25 29-05-2014
    dialmak



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GORA2
    Хотел спросить, пока можно
    В стандартном SFX_Module для конфига можно использовать переменные какие-то типа  %%M, %%P, %%S, %%T ? Не нашёл в справке..
     
    Добавлено:
    Artem_Butenko
    В дополнение  к предыдущему посту напишу, что также через Autoit  легко можно вытянуть
    %SfxVarCmdLine0% - командная строка целиком запуска SFX архива
    %SfxVarCmdLine2% - ключи запуска SFX архива
    Иногда архиполезно

    Всего записей: 14007 | Зарегистр. 27-04-2013 | Отправлено: 18:39 29-05-2014 | Исправлено: dialmak, 18:50 29-05-2014
    GORA2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dialmak

    Цитата:
    В стандартном SFX_Module для конфига можно использовать переменные какие-то типа  %%M, %%P, %%S, %%T ?

    Нет, там их нет и не только их

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 18:51 29-05-2014
    dialmak



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GORA2

    Ну на нет и суда нет
    Я сравнительно недавно открыл для себя модифицированные SFX_Module. Очень крутая штука. Особо понравилось возможность запускать разные версии вложений (x86 или x64) в зависимости от разрядности ОС. Класс!

    Всего записей: 14007 | Зарегистр. 27-04-2013 | Отправлено: 18:58 29-05-2014 | Исправлено: dialmak, 18:59 29-05-2014
    Artem_Butenko



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Skif_off
    dialmak
    GORA2

     
    Спасибо Вам ребята. Только вот проблема, если это не архиватор, который поддерживает ключи командной строки, а любое другое приложение. Т.е., получается AutoIt, это не осилит.

    Всего записей: 725 | Зарегистр. 19-02-2008 | Отправлено: 16:01 30-05-2014
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Artem_Butenko

    Цитата:
    Только вот проблема, если это не архиватор, который поддерживает ключи командной строки, а любое другое приложение.

    То есть? Любой SFX-архив можно так или иначе конфигурировать, выше мы писали о SFX-модуле 7-zip с шикарным функционалом, если у вас что-то другое - назовите.
     
    Если процесс MyProgram.exe после запуска MyProgramAutoIt.exe не завершается, а продолжает висеть в памяти, то можно добавить в MyProgramAutoIt.exe что-то вроде

    Код:
    #include <WinAPIEx.au3>
    #include <FileOperations.au3>
     
    ;Получаем PID процесса
    $sPID = ProcessExists("MyProgram.exe")
    ;Узнаем полное имя,
    $sPathEXE = _WinAPI_GetProcessFileName ($sPID)
    ;режем его на части и
    $aPath = _FO_PathSplit($sPathEXE)
    ;забираем нужное (полный путь)
    $sPath = $aPath[0]

    WinAPIEx.au3 (в текущем релизе 3.3.10.2 идет вместе с дистрибутивом), FileOperations.au3.

    Всего записей: 6597 | Зарегистр. 28-01-2008 | Отправлено: 17:01 30-05-2014 | Исправлено: Skif_off, 17:02 30-05-2014
    dialmak



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Skif_off

    Цитата:
    то можно добавить в MyProgramAutoIt.exe что-то вроде  

    Тоже вариант кстати неплохой. Более универсален, хоть и сложнее.
    Artem_Butenko

    Цитата:
    Только вот проблема, если это не архиватор, который поддерживает ключи командной строки

    Что-то вы запутались. Никакие ключи комстрои в моём примере не требуются. Но будет работать только на модифицированном 7z SFX.

    Всего записей: 14007 | Зарегистр. 27-04-2013 | Отправлено: 17:20 30-05-2014 | Исправлено: dialmak, 17:32 30-05-2014
    Artem_Butenko



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Skif_off  
    dialmak  
    GORA2

     
    Класс!!! Еще раз большое Вам человеческое спасибо ребята!
     
    Skif_off
     

    Цитата:
    #include <WinAPIEx.au3>  
    #include <FileOperations.au3>  
     
    ;Получаем PID процесса  
    $sPID = ProcessExists("MyProgram.exe")  
    ;Узнаем полное имя,  
    $sPathEXE = _WinAPI_GetProcessFileName ($sPID)  
    ;режем его на части и  
    $aPath = _FO_PathSplit($sPathEXE)  
    ;забираем нужное (полный путь)  
    $sPath = $aPath[0]

     
    Назрел другой вопрос, если пользователь сменит имя файла "MyProgram.exe" например на "MyProgram123.exe". Тогда скрипт, как я понимаю, работать не будет. А если у "MyProgram.exe" есть  уникальный GUID, может это поможет. Пожалуйста, помогите разобраться, что-то я немного опять запутался.

    Всего записей: 725 | Зарегистр. 19-02-2008 | Отправлено: 17:27 31-05-2014 | Исправлено: Artem_Butenko, 17:32 31-05-2014
    Zloy_Gelud



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Artem_Butenko

    Код:
    $sPID = ProcessExists(@ScriptName)

    Всего записей: 3267 | Зарегистр. 30-05-2007 | Отправлено: 17:35 31-05-2014
    GORA2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Zloy_Gelud

    Цитата:
    $sPID = ProcessExists(@ScriptName)  

    Дык ему путь не к скрипту нужен, а путь к программе внутри которой этот скрипт спрятан и из которой он запущен.
     
    Artem_Butenko

    Цитата:
    имя файла "MyProgram.exe" например на "MyProgram123.exe". Тогда скрипт, как я понимаю, работать не будет.

    Я Вас расстрою. Даже если имя постоянно (например, MyProgram.exe), то нет гарантии, что не будет запущено одновременно несколько файлов с таким именем (возможно даже разных) из разных мест. Тогда Вы получите PID, но какого из этих процессов неведомо.
     
    Добавлено:
    Если пытаться определить PID родительского процесса, то тут следует знать структуру этого родительского SFX и сколько процессов в нем может быть задействовано до запуска скрипта, а этих процессов может быть и не один.

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 17:43 31-05-2014 | Исправлено: GORA2, 17:44 31-05-2014
    Artem_Butenko



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Zloy_Gelud
    GORA2

     
    А отталкиваться от уникального GUID приложения "MyProgram.exe", разве нельзя?

    Всего записей: 725 | Зарегистр. 19-02-2008 | Отправлено: 18:08 31-05-2014
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Artem_Butenko
    Если у MyProgram.exe есть графическое окно, то можно посмотреть функцию WinGetProcess и с помощью нее получить PID процесса. Заголовой можно посмотреть с помощью Au3Info.exe из дистрибутива AutoIt.

    Всего записей: 6597 | Зарегистр. 28-01-2008 | Отправлено: 18:10 31-05-2014
    madmasles

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Artem_Butenko
    Цитата:
    если пользователь сменит имя файла "MyProgram.exe" например на "MyProgram123.exe"
    GORA2
    Цитата:
    Я Вас расстрою. Даже если имя постоянно (например, MyProgram.exe), то нет гарантии, что не будет запущено одновременно несколько файлов с таким именем (возможно даже разных) из разных мест. Тогда Вы получите PID, но какого из этих процессов неведомо.

    Можно примерно так сделать:
    Код:
    #include <WinAPIEx.au3>
     
    Opt('MustDeclareVars', 1)
     
    Global $iPid, $sPath, $sDir
     
    $iPid = _WinAPI_GetParentProcess()
    If @error Then Exit 1
    $sPath = _WinAPI_GetProcessFileName($iPid)
    If @error Then Exit 2
    ConsoleWrite('$sPath : ' & $sPath & @CR)
    $sDir = _WinAPI_PathRemoveFileSpec($sPath) & '\'
    ConsoleWrite('$sDir : ' & $sDir & @CR)

     

    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 17:07 01-06-2014 | Исправлено: madmasles, 17:08 01-06-2014
    GORA2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    madmasles

    Цитата:
    Если пытаться определить PID родительского процесса, то тут следует знать структуру этого родительского SFX и сколько процессов в нем может быть задействовано до запуска скрипта, а этих процессов может быть и не один.

    Я не прав?

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 17:12 01-06-2014
    madmasles

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GORA2
    Цитата:
    Я не прав?
    Вы правы, конечно, но, если именно SFX запускает скомпилированный скрипт AutoIt, то функция _WinAPI_GetParentProcess() вернет его (SFX) PID, если процесс не закрывается сразу после запуска скрипта.
     
    PS
    ИМХО, если делать инсталлятор, то проще использовать один язык (для меня AutoIt ).

    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 17:29 01-06-2014 | Исправлено: madmasles, 17:42 01-06-2014
    GORA2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    если именно SFX запускает скомпилированный скрипт AutoIt, то функция _WinAPI_GetParentProcess() вернет его (SFX) PID

    Из ТЗ известно, что скрипт AutoIt внутри некоего SFX и все. А как в конфиге этого SFX организован запуск, неведомо. Предположим, что в конфиге прописан запуск батника (CMD), анализ некоего условия и в зависимости от него запуск AutoIt скрипта из этого батника или из батника будет запущен vbs скрипт для решения неких задач с последующим запуском AutoIt скрипта уже из этого vbs.
    Не очень запутал?
     
    Добавлено:

    Цитата:
    если делать инсталлятор, то проще использовать один язык (для меня AutoIt ).

    А многогиговое содержимое архива в FileInstall ,
     

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 17:42 01-06-2014
    madmasles

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GORA2
    Цитата:
    Не очень запутал?
    Все понял
    madmasles
    Цитата:
    ИМХО, если делать инсталлятор, то проще использовать один язык (для меня AutoIt ).

    Добавлено:
    GORA2
    Цитата:
    А многогиговое содержимое архива в FileInstall
    Есть другие способы. И мне трудно представить такой инсталлятор.

    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 17:47 01-06-2014 | Исправлено: madmasles, 17:50 01-06-2014
    Artem_Butenko



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Уважаемый NIKZZZZ предложил следующий скрипт, который позволяет удалять строки в текстовом файле. Возник небольшой вопрос, можно ли в строке:

    Код:
    $sMask = "(?mi)^.*(?:ntoskrnl.exe|KDCOM.dll).*$\s*" ;; Маска для поиска текстовых строк.

    Использовать не статичные маски, а переменные AutoIt, например, -

    Код:
    $sMask = "(?mi)^.*(?:@ScriptName|@ScriptDir).*$\s*" ;; Маска для поиска текстовых строк.

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

    Всего записей: 725 | Зарегистр. 19-02-2008 | Отправлено: 19:39 02-06-2014
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Artem_Butenko
    Можно.

    Код:
    $sMask = "(?mi)^.*(?:" & @ScriptName & "|" & @ScriptDir & ").*$\s*" ;; Маска для поиска текстовых строк.

     
    Добавлено:
    Или

    Код:
    Opt("ExpandVarStrings ", 1)
    $sMask = "(?mi)^.*(?:@ScriptName|@ScriptDir).*$\s*" ;; Маска для поиска текстовых строк.


    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 19:51 02-06-2014 | Исправлено: NIKZZZZ, 20:39 02-06-2014
       

    Страницы: 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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

    Компьютерный форум Ru.Board » Компьютеры » Программы » AutoIT (Часть 3)
    gyra (23-01-2020 10:51): AutoIT (Часть 4)


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru