Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Форум
    RouterOS
    Несколько условий IF с сопоставлением и выполнением соответствующих действий.

    Несколько условий IF с сопоставлением и выполнением соответствующих действий.

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Несколько условий IF с сопоставлением и выполнением соответствующих действий., RouterOS
     
    cicserver
    Guest
    #1
    0
    04.04.2016 07:33:00
    Как мне сравнить два условия и если Оба равны xxx, выполнить действие. Пример: если значение переменной 1 и переменной 2 в окружении равно DOWN, тогда выполнить скрипт. Я искал на форумах и в гугле, но находил только примеры сравнения одного условия.
     
     
     
    profound
    Guest
    #2
    0
    23.09.2020 07:52:00
    Спасибо за пост. Я немного доработал его: добавил логирование событий и изменяю скорость вентилятора только если температура действительно этого требует и если вентилятор в данный момент не используется. Так можно держать главный вентилятор быстрее, а вспомогательный — медленнее и тише, когда устройство достаточно охлаждено. Этот скрипт у меня запланирован (/system script run FanControl) на выполнение каждые 15 секунд.

    :if (([/system health get cpu-temperature]> 60) && ([/system health get use-fan]="auxiliary")) do={
     [/system health set use-fan="main"];
     log info "CPU нагрелся, переключаемся на главный вентилятор";
    }

    :if (([/system health get cpu-temperature]< 55) && ([/system health get use-fan]="main")) do={
     [/system health set use-fan="auxiliary"];
     log info "CPU остыл, переключаемся на вспомогательный вентилятор";
    }
     
     
     
    aacable
    Guest
    #3
    0
    23.09.2020 09:35:00
    Спасибо за вклад.
     
     
     
    rushlife
    Guest
    #4
    0
    09.04.2021 05:21:00
    Большое спасибо, круто! Я использую это для своего собственного мониторинга, спасибо, бро.
     
     
     
    Jotne
    Guest
    #5
    0
    09.04.2021 09:00:00
    Исправленная версия. Нет необходимости ставить ; в конце строки, убраны лишние скобки. {
    :local var1 "DOWN"
    :local var2 "DOWN"
    :if ($var1 = "DOWN" && $var2 = "DOWN") do={
    :put "Оба в состоянии DOWN"
    } else={
    :put "Вверх"
    }
    } Можно использовать любые из этих: and = &&. И это то же самое: or = ||
     
     
     
    mehdi2000
    Guest
    #6
    0
    10.05.2021 19:28:00
    Привет, в терминале всё отлично работает, а в скрипте — нет! Почему???
     
     
     
    rextended
    Guest
    #7
    0
    10.05.2021 21:29:00
    Что ты пытаешься запустить? Вставь сюда.
     
     
     
    mehdi2000
    Guest
    #8
    0
    11.05.2021 19:52:00
    :if (([$percentage] >= 99) or ($EXDate = 1)) do={ /queue simple set $i max-limit=128k/128k; } :if (([$percentage] < 99) and ($EXDate = 0)) do={ /queue simple set $i max-limit=“$maxUpload/$maxDownload”} RB : 951Ui-2HnD v : 6.48.2 в терминале работает нормально, а в скрипте — нет.
     
     
     
    rextended
    Guest
    #9
    0
    12.05.2021 01:52:00
    Это всего лишь фрагмент, он никак не связан с предыдущим постом, и без публикации чего-либо вы спрашиваете, почему не работает???
     
     
     
    mehdi2000
    Guest
    #10
    0
    12.05.2021 04:59:00
    Это не фрагментировано. Я написал этот код из aacable code и не понимаю, почему он не работает в скрипте, но отлично запускается в терминале.
     
     
     
    mrz
    Guest
    #11
    0
    12.05.2021 06:14:00
    Если это не фрагмент, значит он не должен работать. Скрипт ничего не знает обо всех тех неопределённых переменных, которые ты пытаешься использовать.
     
     
     
    icepicknz
    Guest
    #12
    0
    09.09.2021 23:51:00
    Я пытаюсь что-то похожее, возможно ли вложенное условие if внутри do?

    :global sentfound  
    :global sentmissing  
    :local macfound [/ip dhcp-server lease get [find comment="XBOX - 30c Snowmass" status=bound]]

    :if ($macfound != "") do={  
       :if ($sentfound == 0) do {  
           :log info "XBOX найден"  
       }  
       :set sentfound 1  
       :set sentmissing 0  
    } else={  
       :if ($sentmissing = 1) do {  
           :log info "XBOX отсутствует"  
       }  
       :set sentfound 0  
       :set sentmissing 1  
    }
     
     
     
    rextended
    Guest
    #13
    0
    10.09.2021 00:00:00
    Я исправил скрипт, посмотрите на разницу… :global xstatus
    /ip dhcp-server lease
    :local macsearch [get [find where comment="XBOX - 30c Snowmass" and status=bound]]
    :if ([:len $macsearch] > 0) do={
       :if ($xstatus = "missing") do={
           :log info "XBOX найден"
           :set xstatus "found"
       }
    } else={
       :if ($xstatus = "found") do={
           :log info "XBOX пропал"
           :set xstatus "missing"
       }
    }
     
     
     
    icepicknz
    Guest
    #14
    0
    10.09.2021 00:52:00
    Этот скрипт, похоже, не работает: нет ни "Xbox найден", ни "Xbox отсутствует". Если я закомментирую твоё вложенное условие if, тогда всё работает, то есть получается то же, что и у меня. Я знаю, что в моём скрипте else тоже не работал — не выводило "Xbox отсутствует". Ещё одна проблема моего скрипта: если я раскомментирую вложенный if, тоже не работает.  

    Итог по твоему скрипту — вот это не работает:  
    :global xstatus 1  
    /ip dhcp-server lease  
    :local macsearch [get [find where comment="XBOX - 30c Snowmass" and status=bound]]
    :if ([:len $macsearch] > 0) do={
       :if ($xstatus = "missing") do={  
           :log info "XBOX found"  
           :set xstatus "found"  
       }  
    }  

    А если убрать вложенную часть, то работает. В итоге проблема такая же, как у меня:  
    :global xstatus 1  
    /ip dhcp-server lease  
    :local macsearch [get [find where comment="XBOX - 30c Snowmass" and status=bound]]
    :if ([:len $macsearch] > 0) do={
    #    :if ($xstatus = "missing") do={  
           :log info "XBOX found"  
    #        :set xstatus "found"  
    #    }  
    }  

    Может быть, дело в том, что когда элемент не найден, возвращается "no such item"?  
    [admin@OhakuneRTR] /ip dhcp-server lease> get [find where comment=“XBOX - 30c Snowmass” and status=bound]
    [admin@OhakuneRTR] /ip dhcp-server lease> get [find where comment=“NOTHING” and status=bound] no such item
     
     
     
    rextended
    Guest
    #15
    0
    10.09.2021 07:05:00
    Я исправил структуру, чтобы показать, что несколько условий if можно использовать, но не сделал весь скрипт под ваши нужды, чтобы исправить остальное (не присваивайте значение переменной xstatus в первой строке или каждый раз, когда значение равно "1"…). Нужно использовать только find, если результата нет — не выдавать ошибку, а ещё нужно добавить проверку, если переменная xstatus ранее не определялась:

    :global xstatus  
    :if ([:typeof $xstatus] = "nothing") do={ :set xstatus "found" }
    /ip dhcp-server lease  
    :local macsearch [find where comment="XBOX - 30c Snowmass" and status=bound]
    :if ([:len $macsearch] > 0) do={
       :if ($xstatus = "missing") do={  
           :log info "XBOX найден"  
           :set xstatus "found"  
       }  
    } else={  
       :if ($xstatus = "found") do={  
           :log info "XBOX пропал"  
           :set xstatus "missing"  
       }  
    }
     
     
     
    icepicknz
    Guest
    #16
    0
    10.09.2021 10:08:00
    Большое спасибо, немного поигрался, и действительно всё работает.
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры