1 (изменено: Diman_Express, 2017-12-13 20:51:15)

Тема: AHK: Выполнение переменного кода

Название темы могло повергнуть вас в шок, но ближе к делу.
В моей светлой голове появились проблески годной идеи: что если скачивать файл с сервера (текстовик), где будет код. Далее скрипт должен прочитать его и выполнить то, что там написано (на AHK естественно).

FileRead, scriptcoding, Script.txt
Выполнить все, что в Script.txt

Script.txt содержит: msgbox, Script-Coding

Какой может быть способ реализации? Конечно же просто %scriptcoding% в пустую строку не вставишь, но хотелось бы узнать, возможно ли сделать что-то подобное.

2

Re: AHK: Выполнение переменного кода

Измените расширение на .ahk и запустите командой Run.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

3

Re: AHK: Выполнение переменного кода

teadrinker, так у тех, у кого нет AHK на компьютере, не запустится файл

4

Re: AHK: Выполнение переменного кода

teadrinker есть ли какой-нибудь вариант скомпилировать скрипт на компьютере у человека, у которого нет AHK?

5

Re: AHK: Выполнение переменного кода

Не" компилируйте". Скачанный файл с кодом запускаете так:

Run % A_AhkPath " " A_ScriptDir "\my.ahk", % A_ScriptDir

6

Re: AHK: Выполнение переменного кода

teadrinker пишет:

Измените расширение на .ahk

А это зачем?

stealzy
Запустить скрипт с параметром в виде пути к файлу, а как это выполнит my.ahk.
Или это про то чтобы перед этим распаковать из экзешника AutoHotkey.exe, почему тогда A_AhkPath.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

7

Re: AHK: Выполнение переменного кода

Создайте для удобства отдельную функцию.
В неё будете передавать параметры:

  • путь скрипта(для компиляции)

  • путь вывода(для готового exe)

В самой функции сделайте проверку на наличие ahk.


if(установлен)
	Компилируем из папки ahk
else ;не установлен
	Скачиваем из интернета файл-компилятор + компилируем
	;(думаю одного компилятора не хватит и поэтому надо будет прихватить вместе с ним несколько dll-шников)

8

Re: AHK: Выполнение переменного кода

serzh82saratov пишет:

А это зачем?

В смысле, зачем? Чтобы проще было запустить командой Run. Я же не знал, что AHK не установлен. В этом случае без FileInstall не обойтись, т. к. с помощью своего собственного интерпретатора скомпилированный скрипт другой код запустить не сможет.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

9 (изменено: stealzy, 2017-12-15 13:20:42)

Re: AHK: Выполнение переменного кода

MandarinKa02 пишет:

Скачиваем из интернета файл-компилятор

teadrinker пишет:

без FileInstall не обойтись

https://i.imgflip.com/2/db8ny.jpg
Все таки еще раз спрошу, зачем "компилировать"?
Мою ссылку выше проигнорировали, сделаю большую копипасту.

Интерпретатор AutoHotkey при запуске ищет одноименный с ним .ahk в своей директории и если находит, выполняет его.
Интерпретатор можно взять в папке, где установлен AutoHotkey (C:\Program Files\AutoHotkey\AutoHotkey.exe).
Интерпретатор можно переименовать как вам угодно, главное чтобы у .ahk скрипта было такое же имя.
Иконку можно изменить с помощью Menu Tray, Icon, MyScript.ico.
Примерное содержимое папки с переименованным интерпретатором и скриптом:

..
.git
MyScript.ahk     —> это ваш скрипт
MyScript.exe    (да, да, это переименованный AutoHotkey.exe, рекомендую юникод 32-битную версию AutoHotkeyU32.exe)
MyScript.ico
MyScript.ini
MyScript.png

Пользователь кликает по файлу MyScript.exe, а в результате исполняется MyScript.ahk.

Плюсы такого подхода:
• Избавление от возни с "компилированием". Когда вы хотите поделиться с кем-то скриптом, просто архивируете папку и отправляете ее.
• Легкое обновление. Чтобы обновить скрипт, не нужно передавать/скачивать мегабайты интерпретатора и FileInstall.
• Нет проблем с антивирусами. На любой "скомпилированный" скрипт будет десяток ложных детектов, что легко проверить на VirusTotal.
• Из основного скрипта можно выполнить произвольный файл ahk: Run % A_AhkPath " " A_ScriptDir "\SomeScript.ahk", % A_ScriptDir.

Минусы:
• Два файла вместо одного и еще, возможно, файл иконки.
Но если используется #FileInstall, то уже без разницы, потому что и так будет лежать в отдельной папке. Вас ведь не напрягает что установленные в Program Files программы состоят не из одного файла? Да и портативные, состоящие из одного файла весьма редки, будет как минимум файл настроек (.ini). Запускать скрипты также можно ярлыками, на флешке - лаунчерами, нужно просто передать интерпретатору в параметрах путь к скрипту. Ярлык можно создать при первом запуске, т.е. первый раз пользователь запускает из папки, затем по созданному скриптом ярлыку.

If Not FileExist(A_ScriptDir "\MyScript.ini") ; MyScript.ini создается после первого запуска
    FileCreateShortcut, "%A_AHKPath%", %A_Desktop%\MyScript.lnk, "%A_ScriptDir%", "%A_ScriptFullPath%",, %A_ScriptDir%\resource\MyScript.ico

https://s8.hostingkartinok.com/uploads/images/2017/12/ab9301858cf39a5fd71521897c5da923.gif

Но если все же нужно выполнять произвольный код (а-ля eval) из скомпилированного скрипта, то "компилируйте" с помощью ahk_h — он полностью совместимым с обычным ahk кодом, но в нем есть дополнительные возможности, одна из которых позволяет выполнять произвольный код из переменной (файла, и т.п.).

10 (изменено: vlad1986, 2017-12-14 09:29:39)

Re: AHK: Выполнение переменного кода

Diman_Express пишет:

teadrinker есть ли какой-нибудь вариант скомпилировать скрипт на компьютере у человека, у которого нет AHK?

У меня на работе не установлен AHK, скрипты запускаю скомпилированые в exe.

А чтобы скомпилировать скрипт в exe использую Portable версию AHK, есть в сети, компилятор в exe там рабочий, с флешки запускается нормально.

11 (изменено: stealzy, 2017-12-14 09:33:40)

Re: AHK: Выполнение переменного кода

vlad1986, не нужно ничего устанавливать, не нужно ничего "компилировать" — вот что я предлагаю.

12 (изменено: vlad1986, 2017-12-14 09:41:28)

Re: AHK: Выполнение переменного кода

stealzy

Если только 1 скрипт, то я согласен. Но у меня около десятка скриптов под разные задачи. Хранить скрипты в exe в этом случае мне удобнее.

13 (изменено: stealzy, 2017-12-14 10:24:59)

Re: AHK: Выполнение переменного кода

vlad1986
В итоге у вас
1) один и тот же интерпретатор дублируется десяток раз внутри .ехе,
2) вы не можете просто изменить код и запустить, вам надо "компилировать".
По мне удобнее один раз сделать 10 жестких ссылок с соответствующими именами на один файл интерпретатора AutoHotkey.

14 (изменено: vlad1986, 2017-12-14 18:12:49)

Re: AHK: Выполнение переменного кода

stealzy пишет:

По мне удобнее один раз сделать 10 жестких ссылок с соответствующими именами на один файл интерпретатора AutoHotkey.

В свойствах ярлыка?

15

Re: AHK: Выполнение переменного кода

Я так понимаю речь про обычный ярлык. В объект просто пишем путь к "AutoHotkey.ехе" "путь к скрипту".

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

16 (изменено: vlad1986, 2017-12-14 18:17:03)

Re: AHK: Выполнение переменного кода

Спасибо за полезную информацию, надо будет попробовать.

17

Re: AHK: Выполнение переменного кода

Ярлыки — это инструментарий Проводника, а жёсткие ссылки — фишка файловой системы.

18

Re: AHK: Выполнение переменного кода

Интересно.
А как их использовать в данном контексте?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

19 (изменено: stealzy, 2017-12-14 21:41:52)

Re: AHK: Выполнение переменного кода

Поскольку речь про флешку, ярлыки работать не будут из-за разного имени диска флешки.
Жесткая ссылка - то же самое, что скопировать файл на тот же диск с другим именем, просто ссылка не будет занимать дополнительно места на диске.
Создать жесткую ссылку можно с помощью консольной утилиты mklink /J, либо в файловых менеджерах Far или Total Commander по Alt+F6.

20

Re: AHK: Выполнение переменного кода

stealzy пишет:

Поскольку речь про флешку, ярлыки работать не будут из-за разного имени диска флешки.

Но ярлык ведь можно и с относительным путём сделать.
А про жесткую ссылку мне не ясно, что на что ссылатся должно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

21

Re: AHK: Выполнение переменного кода

serzh82saratov, если можно пример ярлыка с относительным путем к интерпретатору и относительным параметром к файлу ahk.

22 (изменено: serzh82saratov, 2017-12-14 23:24:49)

Re: AHK: Выполнение переменного кода

Про параметр не знаю.
Но зачем утилиты, есть cmd, vb, js...

Вот файл js:


var str = "\"Новая папка\\AutoHotkey.exe\" \"Script - копия.ahk\"";

// WScript.Echo(str);
sh = new ActiveXObject("WScript.Shell");
sh.Run(str);

Так не проще?

Или так, чтобы помнить только про экранирование слэша:


var script = "Script - копия.ahk";
var ahk = "Новая папка\\AutoHotkey.exe";

var path = "\"" + ahk + "\" \"" + script + "\""
// WScript.Echo(path);
sh = new ActiveXObject("WScript.Shell");
sh.Run(path);
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

23 (изменено: YMP, 2017-12-14 23:25:30)

Re: AHK: Выполнение переменного кода

serzh82saratov пишет:

А про жесткую ссылку мне не ясно, что на что ссылатся должно.

На файл ссылается запись в каталоге, в котором этот файл "находится". Обычно файл прописан в каком-то одном каталоге. Но в принципе можно прописать и в нескольких, тогда файл будет лежать в нескольких каталогах одновременно, физически оставаясь в одном экземпляре. Или в одном каталоге сделать несколько записей с разными именами для файла.

Т.е. это альтернатива копированию файла. Удобно, например, если файл периодически обновляется, т.к. обновлённый файл не надо копировать во все папки, где этот файл используется.

24

Re: AHK: Выполнение переменного кода

Спасибо, это я уже прочитал в вики. Я не пойму как это материализуется.
Например как постом выше, создаём файл .js, пишем относительно него пути, запускаем, то что в %ahk% запускается с параметром что в %script%.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

25 (изменено: stealzy, 2017-12-15 01:31:10)

Re: AHK: Выполнение переменного кода

serzh82saratov пишет:

как это материализуется

x := [1]
y := x ; аналогия создания жесткой ссылки
MsgBox % x[1] "`n" y[1]
x[1] := 42
MsgBox % x[1] "`n" y[1]

Хотел изобразить с помощью переменных, указывающих на один адрес в памяти, но я не очень понимаю как работать с указателями в ahk:

x := 123
px := &x
y := *px
MsgBox % x "`n" y