Пара полезный приемов при написании скрипта

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
vqd
Модератор
Сообщения: 3605
Зарегистрирован: 26 сен 2013, 14:20
Откуда: НСК
Контактная информация:

эм, ну логично.
Полагаю вы оба примера запускали из консоли...


Есть интересная задача и бюджет? http://mikrotik.site
23q
Сообщения: 57
Зарегистрирован: 16 май 2013, 11:21

та не, я их не запускал вообще :-)
я запускал:

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

:global aaa;
if condition=([/typeof $aaa] = "nothing") do={log info pusto} else={log info nepusto}

работает...
добавление "condition=" помогло.


leon_serv
Сообщения: 2
Зарегистрирован: 29 окт 2014, 22:32

Обнаружил недоработку, не знаю куда писать, может эту тему переименовать и пополнять?
Если надо в скрипте указать в /ip route более одного gateway/

У меня будет три канала ISP.
Пишу скрипт проверки доступности, по результатам меняю gateway в /ip route.

Вводим в консоли
/ip route set [find comment="AllWorkRoute"] gateway=192.168.11.1,192.168.30.1;
Все работает (ну понятно коммент должен быть у маршрута), прописывается два gateway

Теперь берем переменные FirstIfInetGW ThirdIfInetGW
[admin@UtitradeU] > :put $FirstIfInetGW
192.168.11.1
[admin@UtitradeU] > :put $ThirdIfInetGW
192.168.30.1

И обнаруживаем что с переменными задать два и более gateway нельзя:

------------------
[admin@UtitradeU] > /ip route set [find comment="AllWorkRoute"] gateway=192.168
.11.1,192.168.30.1;
[admin@UtitradeU] > /ip route set [find comment="AllWorkRoute"] gateway=$FirstI
fInetGW,$ThirdIfInetGW;
expected end of command (line 1 column 67)
------------------
Ругается на "," перед $ThirdIfInetGW
Пришлось городить через конкатенацию:

:local tmpgw;
:set tmpgw ($FirstIfInetGW .",". $ThirdIfInetGW );
/ip route set [find comment="AllWorkRoute"] gateway=$tmpgw;

Так заработало.
Роутер RB951Ui-2HnD ROS 6.20

P.S. Вообще язык скриптов простой и логичный, но запутанный, запутался где ставят [] а где (), и почему не всегда перед if ставят :if, и почему не обязательно в конце оператора ставить ";"


vqd
Модератор
Сообщения: 3605
Зарегистрирован: 26 сен 2013, 14:20
Откуда: НСК
Контактная информация:

:set tmpgw ($FirstIfInetGW .",". $ThirdIfInetGW );


что есть логично


Есть интересная задача и бюджет? http://mikrotik.site
leon_serv
Сообщения: 2
Зарегистрирован: 29 окт 2014, 22:32

Вопрос - а куда выводит :put "Hello!";
RB951Ui-2HnD с прошивкой 6.20
В терминале выводит в терминал, в скрипте :put выводит в "никуда", приходится использовать /log


vqd
Модератор
Сообщения: 3605
Зарегистрирован: 26 сен 2013, 14:20
Откуда: НСК
Контактная информация:

:-) кто в теме тот поймет глубину замысла

{
:local tmp "str"
[:parse ":global $tmp"]
}


Есть интересная задача и бюджет? http://mikrotik.site
23q
Сообщения: 57
Зарегистрирован: 16 май 2013, 11:21

Вообще язык скриптов простой и логичный, но запутанный, запутался где ставят [] а где (), и почему не всегда перед if ставят :if, и почему не обязательно в конце оператора ставить ";"

":" — для глобальных комманд, с символа "/" начинается командная строка, которая будет выполняться относительно корня конфигурации, префикс может отсутствовать, тогда командная строка выполняется относительно текущего раздела конфигурации


23q
Сообщения: 57
Зарегистрирован: 16 май 2013, 11:21

а как мне глобально переменной присвоить значение:

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

WshShell.SendKeys "{ENTER}"
WScript.Sleep 500
WshShell.SendKeys "reboot"
WshShell.SendKeys "{ENTER}"
WScript.Sleep 2000
WshShell.SendKeys "exit"

???
я присвоил методом считывания в переменную с файла, а как через терминал?
global 1 WshShell.SendKeys "{ENTER}" WScript.Sleep 500 WshShell.SendKeys "reboot" WshShell.SendKeys "{ENTER}" WScript.Sleep 2000 WshShell.SendKeys "exit"
не работает потому-как символы " мешают!


Аватара пользователя
podarok66
Модератор
Сообщения: 4358
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

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

:global 1 "WshShell.SendKeys \"{ENTER}\" WScript.Sleep 500 WshShell.SendKeys \"reboot\" WshShell.SendKeys \"{ENTER}\" WScript.Sleep 2000 WshShell.SendKeys \"exit\""

или

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

:global 1 "WshShell.SendKeys \"{ENTER}\" \r\nWScript.Sleep 500 \r\nWshShell.SendKeys \"reboot\" \r\nWshShell.SendKeys \"{ENTER}\" \r\nWScript.Sleep 2000 \r\nWshShell.SendKeys \"exit\""

, если переносы каретки актуальны.


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
23q
Сообщения: 57
Зарегистрирован: 16 май 2013, 11:21

спасибо!
Реально

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

\"   Insert double quote
\\   Insert backslash
\n   Insert newline
\r   Insert carriage return
\t   Insert horizontal tab
\$   Output $ character. Otherwise $ is used to link variable.
\?   Output ? character. Otherwise ? is used to print "help" in console.
\_    - space
\a    - BEL (0x07)
\b    - backspace (0x08)
\f    - form feed (0xFF)
\v   Insert vertical tab
\xx   Print character from hex value. Hex number should use capital letters.


Ответить