<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Mikrotik.moscow [тема: Проблема с &quot;:put&quot; в скриптинге]</title>
		<link>http://mikrotik.moscow</link>
		<description>Новое в теме Проблема с &quot;:put&quot; в скриптинге форума RouterOS на сайте Mikrotik.moscow [mikrotik.moscow]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Mon, 03 Aug 2026 01:43:19 -0400</pubDate>
		<item>
			<title>Проблема с &quot;:put&quot; в скриптинге</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399896">Проблема с &quot;:put&quot; в скриптинге</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			И еще кое-что. В документации и для справедливости к MT есть старый раздел «Советы и хитрости», на который ссылается текущий мануал по скриптам вот здесь: <noindex><a href="https://wiki.mikrotik.com/wiki/Manual:Scripting_Tips_and_Tricks" target="_blank" rel="nofollow" >https://wiki.mikrotik.com/wiki/Manual:Scripting_Tips_and_Tricks</a></noindex> Там есть раздел с названием «Будьте осторожны при добавлении массива к строке», который, возможно, объясняет это лучше. <br />
			<i>19.03.2022 21:29:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399896</link>
			<guid>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399896</guid>
			<pubDate>Sat, 19 Mar 2022 21:29:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Проблема с &quot;:put&quot; в скриптинге</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399895">Проблема с &quot;:put&quot; в скриптинге</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Моя мысль в том, что вина не в бедном операторе «:put». По сути, при подстановке переменных «лучшей практикой» было бы просто использовать «кастинг», в большинстве случаев это излишне. Но, как уже отмечалось, обработка ошибок в скрипте тоже ограничена, так что лучше вообще избегать появления ошибок. А вот с «.» и массивами все сложнее. Массив может хранить разные вещи (например, пары ключ-значение, список строк/чисел и т.д., функции или их смесь), и от того, что именно хранится, зависит, как сработает :put. Если у вас массив только из строк, он может работать примерно так, как вы ожидаете (хотя, думаю, всё равно не совсем). <br /><br />:global strarr {"abc"; "def"} &nbsp;<br />:put [len $strarr]  <br /># 2 &nbsp;<br />:put [typeof $strarr]  <br />array &nbsp;<br />:put "strarr=$strarr" &nbsp;<br />#strarr=abc;strarr=def &nbsp;<br />:global strstrarr "strarr=$strarr" &nbsp;<br />:put [len $strstrarr]  <br />#2 &nbsp;<br />:put [typeof $strstrarr]  <br />#array &nbsp;<br />:put $strstrarr &nbsp;<br />#strarr=abc;strarr=def &nbsp;<br />:put ($strstrarr-&gt;0) &nbsp;<br />#strarr=abc &nbsp;<br />:put "onemorelevel=$strstrarr" &nbsp;<br />#onemorelevel=strarr=abc;onemorelevel=strarr=def &nbsp;<br /><br />Всё это работает, потому что внутри массива — обычные типы, например строки (или числа — то же самое). Но, как в вашем и в следующем примере, массивы могут хранить пары ключ-значение. И вот когда это происходит, подстановка строк уже не работает. <br /><br />:global arrarr {a=1;b="txt"} &nbsp;<br />:put "$arrarr" &nbsp;<br />#a=1;b=txt &nbsp;<br />:put "some text $arrarr" &nbsp;<br /># ### как было сказано ранее в обсуждении — никакого вывода ### &nbsp;<br /><br />Как работает оператор «точка .» с массивом, действительно описано в справке (например, он ведёт себя как функциональный оператор «set apply»), но почему в первом примере текст повторился — вопрос. Дальше, если у вас есть строка, а затем массив, скрипт может распознать «точечный оператор», если видит сначала строковый токен, а за ним массивный, как в «text$myarray», и поэтому получится тот же эффект. В общем, я буду дальше называть это последовательно — непоследовательно. В какой-то мере многие вещи имеют смысл — просто совсем не хватает нескольких примитивов, а типы получились асимметричными. <br />
			<i>19.03.2022 21:01:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399895</link>
			<guid>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399895</guid>
			<pubDate>Sat, 19 Mar 2022 21:01:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Проблема с &quot;:put&quot; в скриптинге</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399894">Проблема с &quot;:put&quot; в скриптинге</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Amm0, спасибо. Твой ответ оказался самым полезным, и твоя оценка того, что RouterOS постоянно ведёт себя непредсказуемо, кажется вполне точной. Используя твоё предложение и изменив мой исходный пример кода на использование [:tostr], всё действительно работает:<br /><br />{<br /> &nbsp; &nbsp;:local data "this is a test";<br /><br /> &nbsp; &nbsp;{<br /> &nbsp; &nbsp; &nbsp; &nbsp;:local test [:toarray ""];<br /> &nbsp; &nbsp; &nbsp; &nbsp;:set ($test-&gt;"foo") "bar";<br /> &nbsp; &nbsp; &nbsp; &nbsp;:set ($test-&gt;"bar") "baz";<br /><br /> &nbsp; &nbsp; &nbsp; &nbsp;:put "debug #1: test=$test";<br /> &nbsp; &nbsp; &nbsp; &nbsp;:put ("debug #2: test(concat)=" . $test);<br /> &nbsp; &nbsp; &nbsp; &nbsp;:put "debug #3: test(tostr)=$[:tostr $test]";<br /> &nbsp; &nbsp; &nbsp; &nbsp;:put "debug #4: test="; :put $test;<br /> &nbsp; &nbsp;}<br /><br /> &nbsp; &nbsp;:local foo [/system routerboard get board-name];<br /> &nbsp; &nbsp;:set data ($data . "\n" . $foo);<br /> &nbsp; &nbsp;:put "debug: added to data: $foo";<br />}<br /><br />:local response [/tool fetch http-method=post http-data=$data output=user url="https://httpdump.io/eyxhj" as-value];<br /><br />:put ("debug: typeof response=" . [:typeof $response]);<br />:put ("debug: response=" . [:tostr $response]);<br />}<br /><br />Объяснение, что :put “заикается” при попытке вывести массив, хорошо подходит для этого постоянного непредсказуемого поведения OS. Я сделал более детальный тест, чтобы понять, что работает, а что нет:<br /><br />{<br /> &nbsp; &nbsp;:local test [:toarray ""];<br /> &nbsp; &nbsp;:set ($test-&gt;"foo") "bar";<br /> &nbsp; &nbsp;:set ($test-&gt;"bar") "baz";<br /><br /> &nbsp; &nbsp;:put "debug #1: test=$test";<br /> &nbsp; &nbsp;:put ("debug #2: test(concat)=" . $test);<br /> &nbsp; &nbsp;:put "debug #3: test(tostr)=$[:tostr $test]";<br /> &nbsp; &nbsp;:put "debug #4: test="; :put $test;<br />}<br /><br />Первый и второй :put ничего не выводят совсем, а третий и четвёртый — выводят. Что четвёртый выводит — для меня это непоследовательное поведение: RouterOS, кажется, неявно преобразует массив в строку, если выводится только он один, но не делает этого при конкатенации (и при этом не выдаёт ни ошибки, ни предупреждения). Мой опыт работы с другими языками показывает, что неявное преобразование нестроки в строку либо происходит как в пункте #4, либо преобразуется в что-то типа статической строки «{array}» в выводе. Полное отсутствие вывода — это (снова для меня) не последовательно и забирает лишнее время на попытки понять, что вообще происходит и отладить проблему.<br /><br />В любом случае, думаю, я уже достаточно увлёкся в этой ветке — спасибо за полезные комментарии и разъяснения! <br />
			<i>19.03.2022 19:15:00, stuartpbb.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399894</link>
			<guid>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399894</guid>
			<pubDate>Sat, 19 Mar 2022 19:15:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Проблема с &quot;:put&quot; в скриптинге</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399893">Проблема с &quot;:put&quot; в скриптинге</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Скрипты RouterOS точно ведут себя «последовательно, но непредсказуемо». Видимо, тут какой-то спорный баг. Но проблема, скорее, не в команде «:put», а в строке, которую она пытается вывести. Если при подстановке строки (иначе говоря, интерполяции) возникает ошибка, как иногда бывает с «:put "value=$val"», если $val — это массив, тогда строка может провалиться, и в ответ ничего не вернётся. Поскольку подстановка строки происходит до вызова «:put», когда «стек разворачивается» обратно к «:put», строка уже пустая. В общем, лучше всегда убеждаться, что подставляемые переменные — строки, пусть даже пустые, иначе они могут (а могут и не) «упасть» в зависимости от типа (число, массив, ip, ip6, ip-префикс и так далее), а когда строковая подстановка проваливается, возвращается пустая строка. Думаю, основная проблема в том, что ответ от /tool/fetch — это тип «массив», а интерполяция строк с массивами у RouterOS, мягко говоря, «капризная». Почему и когда — неясно, лучше не использовать массивы как переменные внутри строк.<br /><br />Чтобы решить твою проблему, можно просто обернуть переменную в [:tostr $response], например так: :put "debug: response=$([:tostr $response])". Думаю, дополнительный «$([…])» вокруг переменной создаёт новый вызов в стеке, то есть ещё одну «зону обработки ошибок», так что если ошибка случится, стек «свернётся» только до этого вызова и пустую строку вернёт только он, а не весь скрипт. Теоретически ROS-скрипт должен сам пытаться привести к строке через :tostr, и, возможно, так и есть, но синтаксис $([…]) действует как «ловушка» для ошибок, по крайней мере, судя по моему опыту. :tostr важен тем, что он возвращает именно пустую строку, а не ошибку/nil/ничего.<br /><br />В целом, по документации много пробелов, но главная беда — это «неряшливость» MikroTik с типами переменных. Например, какие-то команды CLI приводят типы автоматически, другие — нет, а некоторые преобразования возможны только с хитростями. <br />
			<i>18.03.2022 23:03:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399893</link>
			<guid>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399893</guid>
			<pubDate>Fri, 18 Mar 2022 23:03:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Проблема с &quot;:put&quot; в скриптинге</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399892">Проблема с &quot;:put&quot; в скриптинге</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Хорошо, но сейчас этот код использует переменные с глобальной областью видимости, а не локальные. Цель — применять локальную область, чтобы не сохранять состояние в глобальном окружении, если это не нужно, и держать локальные переменные внутри того блока кода, к которому они относятся. Ты также используешь :parse, чтобы обернуть fetch, и :delay — зачем это нужно/где это описано? По документации и примерам кода, которые я нашёл (<noindex><a href="https://wiki.mikrotik.com/wiki/Manual:Tools/Fetch" target="_blank" rel="nofollow" >https://wiki.mikrotik.com/wiki/Manual:Tools/Fetch</a></noindex>), есть такой пример: &nbsp;<br />{ &nbsp;<br /> &nbsp; &nbsp;:local result [/tool fetch url=http://10.0.0.1/disable_ether2.php as-value output=user];  <br /> &nbsp; &nbsp;:if ($result-&gt;"status" = "finished") do={ &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp;:if ($result-&gt;"data" = "0") do={ &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/interface ethernet set ether2 disabled=yes; &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp;} else={ &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/interface ethernet set ether2 disabled=no; &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp;} &nbsp;<br /> &nbsp; &nbsp;} &nbsp;<br />} &nbsp;<br />Код, который я изначально использовал в качестве примера, работает, и $response устанавливается (у меня есть полностью рабочий скрипт, который так же работает примерно на 30 роутерах под управлением ROS v6 и v7), просто debug :put после этого не выводит никаких данных (в этом и был смысл этой темы). <br />
			<i>18.03.2022 22:29:00, stuartpbb.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399892</link>
			<guid>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399892</guid>
			<pubDate>Fri, 18 Mar 2022 22:29:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Проблема с &quot;:put&quot; в скриптинге</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399891">Проблема с &quot;:put&quot; в скриптинге</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Но, пожалуйста, «@rextended», прекрати высказываться на людей, которые не знают об этих ограничениях! Скриптовый движок в таких вещах, как управление stdout/stderr, просто провален: например, он не умеет ловить сообщения об ошибках и не поддерживает коды ошибок. Реализация :put тоже провалилась, потому что она вовсе не делает то, чего от неё ждут люди. <br />
			<i>18.03.2022 18:24:00, Larsa.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399891</link>
			<guid>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399891</guid>
			<pubDate>Fri, 18 Mar 2022 18:24:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Проблема с &quot;:put&quot; в скриптинге</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399890">Проблема с &quot;:put&quot; в скриптинге</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Вау… Я не ожидал такой реакции от поклонников Mikrotik. Было бы полезнее сначала попытаться выяснить детали, прежде чем бросаться с обвинениями и говорить, что человек полностью неправ, просто за то, что он попросил обновить документацию. Надо было и мне чуть яснее сформулировать. Моя проблема не с планировщиком задач, а с примерно таким скриптом и тем, что :put ведёт себя не так, как ожидается:<br /><br />{<br /> &nbsp; &nbsp;:local data "this is a test";<br /><br /> &nbsp; &nbsp;{<br /> &nbsp; &nbsp; &nbsp; &nbsp;:local foo [/system routerboard get board-name];<br /> &nbsp; &nbsp; &nbsp; &nbsp;:set data ($data . "\n" . $foo);<br /> &nbsp; &nbsp; &nbsp; &nbsp;:put "debug: added to data: $foo";<br /> &nbsp; &nbsp;}<br /><br /> &nbsp; &nbsp;:local response [/tool fetch http-method=post http-data=$data output=user url="https://httpdump.io/eyxhj" as-value];<br /><br /> &nbsp; &nbsp;:put "debug: response=$response";<br />}<br /><br />Я проверял это на RouterOS v6 и v7: оба выведут первую команду :put, но вторую нет. Моя версия — внутренний блок кода (используемый, чтобы переменная :local foo была видна только внутри него) перенаправляет вывод так, что :put после fetch просто не появляется в консоли. В документации я ничего не нашёл, что объясняло бы такое поведение, поэтому и попросил обновить документацию, чтобы объяснить случаи, когда :put ведёт себя не так, как логично ожидать (и как работают print в других языках сценариев). <br />
			<i>18.03.2022 17:56:00, stuartpbb.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399890</link>
			<guid>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399890</guid>
			<pubDate>Fri, 18 Mar 2022 17:56:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Проблема с &quot;:put&quot; в скриптинге</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399889">Проблема с &quot;:put&quot; в скриптинге</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Когда у тебя есть скрипт, который запускается, скажем, ровно в 00:00 каждую ночь, где ты ожидаешь увидеть вывод :put? У тебя круглосуточно открыта терминальная сессия, которая ждёт этот вывод? Вот почему у нас есть :log, который отправляет вывод в лог или syslog. Данные также можно отправлять по email, ftp, http, мигать светодиодом +++ (гугли email, telegram +++++). Я использую :put только когда отлаживаю скрипт, чтобы в терминале увидеть, что там происходит во время теста. <br />
			<i>18.03.2022 13:24:00, Jotne.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399889</link>
			<guid>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399889</guid>
			<pubDate>Fri, 18 Mar 2022 13:24:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Проблема с &quot;:put&quot; в скриптинге</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399888">Проблема с &quot;:put&quot; в скриптинге</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Могли бы вы обновить документацию, чтобы это отражалось? <noindex><a href="https://wiki.mikrotik.com/wiki/Manual:Scripting" target="_blank" rel="nofollow" >https://wiki.mikrotik.com/wiki/Manual:Scripting</a></noindex> Я только что столкнулся с той же проблемой и был уверен, что это баг, пока не прочитал это. <br />
			<i>17.03.2022 02:35:00, stuartpbb.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399888</link>
			<guid>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399888</guid>
			<pubDate>Thu, 17 Mar 2022 02:35:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Проблема с &quot;:put&quot; в скриптинге</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399887">Проблема с &quot;:put&quot; в скриптинге</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Не получается использовать :put для вывода содержимого глобальной переменной внутри скрипта. В терминале cli всё работает нормально, и видно, что глобальная переменная меняется из скрипта, но при запуске скрипта в консоли никакого вывода нет. Использую версию 6.43.7 и последнюю Winbox. Искал решение на форуме и в гугле — без успеха. Буду признателен за советы. <img class="lazyload "  src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/upload/forum/mikrotik/d9e02801f61689a8bd069ce28c11e039b045f277.jpeg" alt="Пользователь добавил изображение" border="0" /> <img class="lazyload "  src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/upload/forum/mikrotik/abad80034d6b2e107967e30e4a36c3cfe225cc81.jpeg" alt="Пользователь добавил изображение" border="0" /> <br />
			<i>01.01.2019 02:16:00, Okietim.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399887</link>
			<guid>http://mikrotik.moscow/forum/forum57/85784-problema-s-_put_-v-skriptinge/message399887</guid>
			<pubDate>Tue, 01 Jan 2019 02:16:00 -0500</pubDate>
			<category>RouterOS</category>
		</item>
	</channel>
</rss>
