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

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Чтобы ввести строку из Терминала, конечно, можно написать небольшой скрипт с использованием :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"]


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Ответить