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

Ввод строки из терминала

Добавлено: 31 авг 2023, 13:32
Sertik
Чтобы ввести строку из Терминала, конечно, можно написать небольшой скрипт с использованием :terminal inkey типа такого:

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

:local EnterString do={
     :local cont; :local string
        :while ($cont!=13) do={
          :if ([:len $string]<254) do={
             :local key ([:terminal inkey])
                :if ($key!=13) do={
                     :local char [[:parse "(\"\\$[:pick "0123456789ABCDEF" (($key >> 4) & 0xF)]$[:pick "0123456789ABCDEF" ($key & 0xF)]\")"]]
             :set string ("$string"."$char")}
             :set cont $key
         }
      }
:return $string}
Эта небольшая функция позволяет ввести строку длиной до 254 символов посимвольно. В этом примере ввод прекращается, если пользователь нажимает клавишу "Enter" (код клавиши Enter=$0D (13). Разумеется посимвольный ввод позволяет использовать для конца ввода любые другие ограничения (например другой символ окончания или количество вводимых символов), что позволяет наиболее гибко настроить ввод.
Её можно дополнить разными плюшками с моментальной проверкой вводимых символов, ограничивать длину формируемой строки и .т.д...


Но, если нужно проще и быстрее можно использовать такую фичу: https://forum.mikrotik.com/viewtopic.php?t=135112

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

:local input do={:put $1; :return;}
:local login [$input "Enter login:"]
:local password [$input "Enter password:"]
:put "Login is [$login] and password is [$password]"
Работает это так:

Enter login
value: admin
Enter password
value: test
Login is [admin] and password is [test]

Фишка в том, что пустой :return из Терминала всегда предлагает ввести значение. Окончанием ввода обязательно служит клавиша "Enter".Единственным неудобством будет вывод слова "value:" в качестве приглашения перед вводом, но если это не раздражает, то всё нормально работает.
Удобно использовать из интерактивных скриптов настройки конфигураций и т.д...


В Роутер ОС 7.11 появилась ещё одна возможность - использование :terminal ask. Эта новая команда лишена неудобства, связанного с выводом приглашения ко вводу значения :value. Окончанием ввода также обязательно служит клавиша "Enter".

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

:global Answer [:terminal/ask "Do you agree to use Router OS 7?"]
:put $Answer
Ну или как-то так (для примера) :-) :

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

{
:global Answer []
:while ($Answer!="yes") do={
:set Answer [:terminal/ask "Do you agree to use Router OS 7?"]
}
}
Можно также задавать любое приглашение ко вводу, если использовать параметр "preinput":

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

:global userinput [/terminal/ask preinput="preinput>" prompt="Some text that in prompt"]