Что нового

Как скомпилировать несколько скриптов в 1 портабельный exe

dr.room

Чайник
Сообщения
272
Репутация
0
Версия AutoIt: 3.
3.3.14.2
Описание:
Всем привет !
Подскажите, пожалуйста, как можно скомпилировать несколько скриптов в 1 общий exe c такими вариантами:
а) включить несколько взаимосвязанных скриптов из одной общей папки, exe портабельный, после запуска работает как и скрипты
б) включить несколько взаимосвязанных скриптов из общей папки + подпапки, ...
Спасибо
Ps
И если можно хотя бы 1 пример, мне еще ни разу это не удавалось
Примечания:
Я могу сейчас только 1 exe cделать из 1 скрипта. - не более... :(

Пример скриптов
1
Код:
$iMsgBox = MsgBox (262180,"Вопрос","Запустить скрпт 2 ? ")
Select
	Case $iMsgBox = 6 ;Да
		
		ShellExecuteWait("Скрипт 2 .au3")
	Case $iMsgBox = 7 ;Нет
	
		Exit
EndSelect

2
Код:
MsgBox (262208,"Сообщение","Всем привет! Это скрипт №2" & @CRLF & "Если Вы читаете это сообщение значит удалось после капмиляции, запустить один скрипт через другой! " & @CRLF & "")
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
963
dr.room [?]
Подскажите, пожалуйста, как можно скомпилировать несколько скриптов в 1 общий exe
Читаем справку:
Код:
#include
 
Автор
D

dr.room

Чайник
Сообщения
272
Репутация
0
Да точно, спасибо
Насколько я понял, нужно провести замену ShellExecuteWait на #include
Код:
$iMsgBox = MsgBox (262180,"Вопрос","Запустить скрпт 2 ? ")
Select
    Case $iMsgBox = 6 ;Да
        
        #include "Скрипт 2 .au3"
    Case $iMsgBox = 7 ;Нет
    
        Exit
EndSelect

Вот с относительными путями не выходит :stars:
Если, предположим, нужно вызывать файл Скрипт 2 .au3 не из общей папки а из дочерней
Без компиляции я бы записал так
Код:
ShellExecuteWait(@ScriptDir& "\2\Ckript 2.au3") ; где 2 - дочерняя папка содержащая Ckript 2.au3

Но как прописать тот же путь при включении #include ?
 
A

Alofa

Гость
dr.room объясните чего вы хотите всем этим добиться?
При использовании директивы "#include" во время компиляции содержимое всех ваших дочерних скриптов соберестя в один общий скрипт. Т.е в итоге будет так:
Код:
$iMsgBox = MsgBox(262180, "Вопрос", "Запустить скрпт 2 ? ")
Select
	Case $iMsgBox = 6 ;Да

		MsgBox(262208, "Сообщение", "Всем привет! Это скрипт №2" & @CRLF & "Если Вы читаете это сообщение значит удалось после капмиляции, запустить один скрипт через другой! " & @CRLF & "")
	Case $iMsgBox = 7 ;Нет

		Exit
EndSelect


Это кстати легко проверить: перетащите мышкой файл основного скрипта на "...\AutoIt3\SciTE\au3Stripper\AU3Stripper.exe". После обработки рядом с вашим скриптом появится еще один - обработанный.
 
Автор
D

dr.room

Чайник
Сообщения
272
Репутация
0
Prog
Спасибо! Ох уж мне этот синтаксис :smile:


Добавлено:
Сообщение автоматически объединено:

Alofa
во время компиляции содержимое всех ваших дочерних скриптов соберется в один общий скрипт
Уже проверил. Так и есть. Но мои исследования были шире. Они касались не только "прямых потомков" но и "всех родственников". Оказалось, что многие из них не поддерживают наследование и нужно установить взаимосвязь.
Спасибо
 
Автор
D

dr.room

Чайник
Сообщения
272
Репутация
0
Еще такой вопрос
Подскажите, пожалуйста, как перезапустить скриптом самого себя ?
Если использовать
Код:
ShellExecuteWait

то перезапустить можно сколько угодно раз
Но применение
Код:
#include

вызывает превышение глубины вложения и ошибку запуска
 

ra4o

Скриптер
Сообщения
985
Репутация
180
Есть UDF для этого, вот :
 

Вложения

A

Alofa

Гость
OffTopic:
dr.room сказал(а):
... Если использовать
Код:
ShellExecuteWait

то перезапустить можно сколько угодно раз...
Попробуйте в ОС на которой не установлен Autoit.

dr.room сказал(а):
... Но применение
Код:
#include

вызывает превышение глубины вложения и...
А у вас не вызывает желание понять вообще зачем и что это?
 
Автор
D

dr.room

Чайник
Сообщения
272
Репутация
0
ra4o сказал(а):
Есть UDF для этого, вот :
Спасибо. Сори, не понял как применить?


Добавлено:
Сообщение автоматически объединено:

Alofa сказал(а):
А у вас не вызывает желание понять вообще зачем и что это?
Спасибо. Отчего же нет - возникает :smile: Пересмотрел свое отношение к
Код:
#include
Видимо оптимально будет функции расположить в стартовом скрипте, в остальных использовать их вызов.
 

ra4o

Скриптер
Сообщения
985
Репутация
180
Спасибо. Сори, не понял как применить?
Подключаете UDF к скрипту
Код:
#include <Restart.au3>
и когда нужен рестарт скрипта вызываете функцию
Код:
_ScriptRestart()
 

Norm

Чайник
Сообщения
44
Репутация
1
Да точно, спасибо
Насколько я понял, нужно провести замену ShellExecuteWait на #include
Код:
$iMsgBox = MsgBox (262180,"Вопрос","Запустить скрпт 2 ? ")
Select
    Case $iMsgBox = 6 ;Да
        
        #include "Скрипт 2 .au3"
    Case $iMsgBox = 7 ;Нет
    
        Exit
EndSelect
В продолжение данной темы
Подскажите пожалуйста
Как будет выполняться этот скрипт?
Параллельно основному типа запустил Run и забыл или
основной скрипт ждёт пока скрипт их include не выполнится по типу RunWait?
 

Tempo

Скриптер
Сообщения
495
Репутация
145
В продолжение данной темы
Подскажите пожалуйста
Как будет выполняться этот скрипт?
Параллельно основному типа запустил Run и забыл или
основной скрипт ждёт пока скрипт их include не выполнится по типу RunWait?
Чем ваc не устроил ответ Alofa?
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1 517
Репутация
321
Неужели так трудно написать: Как Run или Как RunWait?
На этот вопрос трудно ответить, потому что Вы смешиваете кислое с соленым. Препроцессорная директива include нужна лишь для того, чтобы при сборке Вашего кода для интерпретатора, они были заменены на их содержимое. Они не выполняют никакой код и не запускают скриптов. Они лишь указывают что при сборке нужно заменить include на его содержимое
 
  • Like
Реакции: Norm

Norm

Чайник
Сообщения
44
Репутация
1
На этот вопрос трудно ответить, потому что Вы смешиваете кислое с соленым. Препроцессорная директива include нужна лишь для того, чтобы при сборке Вашего кода для интерпретатора, они были заменены на их содержимое. Они не выполняют никакой код и не запускают скриптов. Они лишь указывают что при сборке нужно заменить include на его содержимое
Спасибо за разъяснение
Вот если бы и в справке такая информация была, .....
Тогда в моем случае, что бы запустить выполнение стороннего скрипта, что бы он параллельно основному выполнялся, мне нужно его скомпилировать в отдельный файл и тогда он будет выполнятся параллельно основному ЕХЕ-файлу.
И как я понимаю, если я не ошибаюсь, то альтернативы этому в Autoit нет.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1 517
Репутация
321
Тогда в моем случае, что бы запустить выполнение стороннего скрипта, что бы он параллельно основному выполнялся, мне нужно его скомпилировать в отдельный файл и тогда он будет выполнятся параллельно основному ЕХЕ-файлу.
И как я понимаю, если я не ошибаюсь, то альтернативы этому в Autoit нет.
EXE файл программы на AutoIT это "спецархив" из EXE файла самого AutoIT и вашего скрипта. И если Вы при сборке не укажете специальные директивы для отключения возможности запуска Вашей программой других скриптов, то Вы сможете это сделать примерно таким скриптом
Код:
Run(@AutoItExe & ' /AutoIt3ExecuteScript ' & $fullScriptPath)
 

Norm

Чайник
Сообщения
44
Репутация
1
EXE файл программы на AutoIT это "спецархив" из EXE файла самого AutoIT и вашего скрипта. И если Вы при сборке не укажете специальные директивы для отключения возможности запуска Вашей программой других скриптов, то Вы сможете это сделать примерно таким скриптом
Код:
Run(@AutoItExe & ' /AutoIt3ExecuteScript ' & $fullScriptPath)
Я привольно понял, что так нужно запускать другой скомпилированный скрипт иначе не получится или криво сработает?
Или что из основного скомпилированного скрипта, можно запустить сторонний не скомпилированный скрипт? (Для запуска на компьютере без установки на него Autoit)
 
Верх