Передать параметры от одного скрипта другому - что проще скажете Вы. Сделай это через глобальные переменные или функции.
Но недавно один наш форумчанин обратился ко мне именно с подобным вопросом и я вспомнил, что такое уже делал, когда передавал параметры из Телеграмм скрипту без всяких глобальных переменных вот такой конструкцией двойного парсинга:
[[:parse "[:parse [/system script get $scrName source]] $Var1]"]]
и она реально работает.
Скрипт приемник должен "подхватить" передаваемый параметр(ы). При этом они могут быть именованными и позиционными.
При этом именованные даже не нуждаются в объявлении их имён в скрипте-приёмнике, а позиционные должны быть локализованы.
Проблема в том, что все параметры, какими бы они не были, передаются как строковые (превращаются в тип "str").
Мне удалось обойти и эту проблему - передавать параметры с сохранением их типов без всяких переменных и функций.
Единственно, с чем не удалось справиться - это передать кириллические символы (пока не удалось, может и это возможно).
Поколдовав на досуге, я пришёл в итоге к такой финишной конструкции (на сегодня):
Код: Выделить всё
[[:parse "[:parse [/system script get $scrName source]] Par1=[:to$[:typeof $Var1] $Var1] [:to$[:typeof $Var2] $Var2] [:to$[:typeof $Var3] $Var3] [:to$[:typeof $Var4] $Var4] [:to$[:typeof $Var5] $Var5]"]]
Обратить внимание нужно вот на что:
1. Если нужно передать именованный параметр, то его нужно передавать записью вида Par1=[:to$[:typeof $Var1] $Var1] , где Par1 - это его имя, которое будет известно скрипту-приемнику (:local даже делать не нужно)
2. Если нужно передать позиционный параметр, то его нужно передавать записью вида [:to$[:typeof $Var2] $Var2], тогда подхватить в скрипте-приемнике его можно будет через $0, $1 и т.д..
3. Интересна запись [:to$[:typeof $VarX] $VarX]. Что она собственно делает ? Оказалось, что чтобы :parse передал тип переменной, ему нужно его буквально повторить. То есть если Вы передаете, например, время (тип "time"), содержащееся в переменной $X, то нужно в моей конструкции :parse указать это ещё раз явно [:totime $X], хотя [:typeof $X] и так уже ="time". Иначе :parse превратит время в строку. Поскольку неохота писать каждому параметру его тип напрямую типа [:totime $Var1], [:toip 192.168.88.1] и т.д..., я заменил это универсальной конструкцией :to$[:typeof $VarX] $VarX]. Тогда :parse "налету" определяет тип параметра и передает его как нужно !
Пример:
Скрипт источник:
Код: Выделить всё
# передача параметра другому скрипту
:local scrName "BIBLIO_scriptReceiver"
:local Var1 "mamulia"
:local Var2 "12"
:local Var3 14
:local Var4 192.168.0.1
:local Var5 [/system clock get time]
:log info ("$Var1"." $[:typeof $Var1]")
:log info ("$Var2"." $[:typeof $Var2]")
:log info ("$Var3"." $[:typeof $Var3]")
:log info ("$Var4"." $[:typeof $Var4]")
:log info ("$Var5"." $[:typeof $Var5]")
# обе записи ниже правильные, первая выполняет скрипт в параллельном процессе - в фоне
# :execute script="[[:parse \"[:parse [/system script get $scrName source]] $Var1 $Var2 $Var3 $Var4 $Var5\"]]";
# [[:parse "[:parse [/system script get $scrName source]] $Var1 $Var2 $Var3 [:to$[:typeof $Var4] $Var4] [:totime $Var5]"]]
[[:parse "[:parse [/system script get $scrName source]] Par1=[:to$[:typeof $Var1] $Var1] [:to$[:typeof $Var2] $Var2] [:to$[:typeof $Var3] $Var3] [:to$[:typeof $Var4] $Var4] [:to$[:typeof $Var5] $Var5]"]]
Код: Выделить всё
:log warning ("$Par1"." $[:typeof $Par1]")
:log warning ("$Par2"." $[:typeof $Par2]")
:local Par3 $0
:local Par4 $1
:local Par5 $2
:log error ("$Par3"." $[:typeof $Par3]")
:log error ("$Par4"." $[:typeof $Par4]")
:log error ("$Par5"." $[:typeof $Par5]")
Если кому удастся передать в качестве параметра кириллицу или сделать это другим способом (более изящно) - сигнализируйте !