Страница 1 из 1

определить имя исполняемого скрипта из самого скрипта

Добавлено: 26 фев 2020, 00:12
Sertik
Приветствую любителей скриптов !

Вопросик маленький - кто-нибудь знает как можно из исполняемого скрипта получить в переменную имя этого скрипта ?
Понимаю, что из /system script job надо выдергивать, но сразу приходит мысль, что там может оказаться несколько имен текущих исполняемых системой в данный момент скриптов ...

Re: определить имя исполняемого скрипта из самого скрипта

Добавлено: 26 фев 2020, 01:19
Sertik
Сам спросил, сам ответил. Похоже этого вообще нельзя сделать ибо /system script job не содержит имён исполняемых скриптов ! Вот уж не ожидал от Микротика ... тупо сделано. :ny_tik: а могли бы ...

Может по другому как можно ?

Re: определить имя исполняемого скрипта из самого скрипта

Добавлено: 26 фев 2020, 20:58
podarok66
Чё эта? у меня вроде как получилось взять. Хотя не факт, ведь действительно работать же может несколько сразу...

Код: Выделить всё

:log info "1";
:delay 5;
:local tre [/system script job get [find script!=""] script]
:log info "$tre";
:log info "Script stop"
P.S.: Пришла в голову идея. Для данного скрипта - создаём отдельного юзера и от его имени запускаем скрипт, имя юзера будет уникальным признаком скрипта, следовательно имя скрипта можно определить безошибочно :-)

Re: определить имя исполняемого скрипта из самого скрипта

Добавлено: 27 фев 2020, 00:04
Sertik
Уже по идее очень неплохо. Но как то с этим не сталкивался. А как запустить скрипт от имени конкретного юзера ? В смысле из планировщика ... (простите за наглость такую с моей стороны) ... :-) Если мне надо чтобы он по расписанию исполнялся ? Он от того же usera будет Планировщиком запущен ?

Re: определить имя исполняемого скрипта из самого скрипта

Добавлено: 27 фев 2020, 00:38
Sertik
По Вашей подсказке вот так работает. Создаем юзера Username. Заходим под ним в winbox (или через telnet и терминал). Создаем скрипт (имя произвольное естественно). Выходим. Заходим снова под своим обычным доступом (админским, допустим).

Исполняем код:

Код: Выделить всё

:log info "1";
:delay 5;
:local tre [/system script job get [find owner ="Username"] script]
:log info "$tre";
:log info "Script stop"
В $tre получаем имя исполненного скрипта.
:bra_vo: Podarok66 !

Но ! скрипт такой должен быть создан "из-под" уникального юзера. Если одновременно в job окажутся два таких, то будет косяк разумеется, find его тогда не сможет найти (в списке будет два одинаковых).

Также не понятно мне пока как всё это будет работать из под Планировщика. Задание в планировщике на исполнение этого скрипта тоже видимо должно быть создано тем же уникальным юзером ...

Немного "гиморное" решение, но оригинальное. Интересно, может как-то ещё можно ?

Re: определить имя исполняемого скрипта из самого скрипта

Добавлено: 27 фев 2020, 09:30
podarok66
Я с самого начала понимал про "костыльность" этого варианта. Но пока другого не вижу...

Re: определить имя исполняемого скрипта из самого скрипта

Добавлено: 17 сен 2021, 20:13
yalta
Позволю свою ремарку.
Возникла задача - закрывать ранее запущенный экземпляр скрипта, при старте нового.
Загвоздка в отсутствии имени в jobs и в невозможности из идентификаторов выделить идентификатор текущего скрипта, - странно, но...
Предлагаемое решение, немедленно при старте "нашего" скрипта, формирует массив идентификаторов всех запущенных скриптов. Фокус в том, что идентификатор в последнем элементе массива и является идентификатором "нашего" скрипта. Выбираем его, восстанавливаем имя, далее.... хотя, imho далее и так очевидно.

Код: Выделить всё

:local arrIdScr [:toarray [/system script job find where script~"[a-zA-Z0-9]{1,}"]]
# определяем имя настоящего скрипта по последнему в массиве идентификатору
:local ScriptName [/system script job get ($arrIdScr->([:len $arrIdScr]-1)) value-name=script]
# формируем массив идентификаторов, соответствующих имени
:set $arrIdScr [/system script job find script=$ScriptName]
# "откусываем" id нашего скрипта
:set $arrIdScr [:pick $arrIdScr 0 ([:len $arrIdScr]-1)]
# цикл удаления копий скрипта за исключением выше "откушенного"
:foreach i in=$arrIdScr do={
/system script job remove $i
# :log warning "removed: $i"
}
:while (true) do={ :delay 5 }
Вставляем в скрипт с любым именем. Чтобы набрать некоторое количество запущенных копий - достаточно закомментировать строку /system script job remove и кликнуть на скрипт несколько раз. Затем - раскомментируем и исполняем ещё раз. Проверяем результат.
Для исключения добавления в начальный массив фоновых процессов "без имени", выставляющих свой идентификатор - использовал regex.

Re: определить имя исполняемого скрипта из самого скрипта

Добавлено: 22 сен 2021, 13:04
Sertik
Значит скрипт может определить своё имя вот так:

# скрипт определяет своё имя.

:local arrIdScr [:toarray [/system script job find where script~"[a-zA-Z0-9]{1,}"]]
:local ScriptName [/system script job get ($arrIdScr->([:len $arrIdScr]-1)) value-name=script]
:log warning $ScriptName

Спасибо Вам yalta ! Пригодится.

Re: определить имя исполняемого скрипта из самого скрипта

Добавлено: 02 мар 2022, 18:33
-13-
На dhcp-client, на интерфейс от провайдера можно повесить скрипт

Код: Выделить всё

/ip route set [find comment="ISP2"] gateway=($"gateway-address") disabled=no
где переменная ($"gateway-address"), берется из закладки status, хотя она называется везде "gateway".


Может и скрипты такие переменные содержат, просто мы не знаем как они пишутся...
Ну что то, типа такого...

Код: Выделить всё

/interface l2tp-client set [find comment="test"] name=($"script-name")

Re: определить имя исполняемого скрипта из самого скрипта

Добавлено: 03 дек 2023, 15:45
Sertik
Решение этой задачи Rextended:
# нужно сделать уникальную метку в теле самого скрипта и потом по ней определить имя скрипта !

:local UniqueScriptID "QnJhdm8h"
:local ThisScriptName [/system script get ([find where source~"$UniqueScriptID"]->0) name]
:put $ThisScriptName