Как реализовать вывод обратного отсчета в iPXE?
Ссылка скопирована
set ctr:int32 5 :loop iseq ${ctr} 0 && goto exit || goto next :next echo Timer: ${ctr} inc ${ctr} -1 prompt -k M -t 1000 && goto main_menu || goto loop :end_loop
Сейчас ситуация такая: задача такая: ожидать нажатие клавиши M в течении 5 секунд. Если не нажата - выходим, если нажата переходим в главное меню.
По вводным: при этом хочу выводить отсчет времени.
По вводным: но почему-то каждый раз выводит
Timer: 5
Не уменьшая значение.
Сейчас ситуация такая: при этом если проверять через show ${ctr} - он в цикле показывает что значение уменьшает (правда с 0, а не с 5).
По вводным: пытался в цикле указывать так:
set message Timer:${ctr} echo ${message}
Не дало результата.
Нужно решить такую задачу?
Заказать помощь
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Лучший ответ
1
Другие ответы (0)
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопроскомментарий
Вам также может быть интересно
VPN
Как правильно настроить vless для Android TV?
1 ответ
Pyrogram
Как правильно зарегистрировать юзер бота в Telegram?
1 ответ
печатные-платы
Как заставить запускаться программу M3.exe от компании Hanxing AOI в инспекционной машине на Windows 7 Pro?
1 ответ
1С-Битрикс
Можно ли быстро сделать зеркало сайта на связке Битрикс+Аспро с другими настройками?
1 ответ

В iPXE переменная не уменьшается из-за того, как вы используете
incи переходы. В iPXE команды имеют свою семантику, и не все конструкции работают как в обычном shell. Для обратного отсчёта проще использоватьiseq,sleep/prompt -tи явное изменение переменной.Попробуйте такой вариант:
set ctr 5 :loop iseq ${ctr} 0 && goto exit || echo Timer: ${ctr} prompt --key M --timeout 1000 Press M for menu... && goto main_menu || inc ctr -1 goto loop :main_menu echo Go to menu goto end :exit echo Timeout goto end :endset ctr 5 :loop iseq ${ctr} 0 && goto exit || echo Timer: ${ctr} prompt --key M --timeout 1000 Press M for menu... && goto main_menu || inc ctr -1 goto loop :main_menu echo Go to menu goto end :exit echo Timeout goto end :end
Ключевой момент: после
promptнужно выполнить уменьшение счётчика отдельной командой и вернуться в loop. Если командаincу вашей версии iPXE не принимает отрицательное значение так, как ожидается, используйте другой подход — заранее развернуть таймер:echo Timer: 5 prompt --key M --timeout 1000 Press M... && goto main_menu || echo Timer: 4 prompt --key M --timeout 1000 Press M... && goto main_menu || echo Timer: 3 prompt --key M --timeout 1000 Press M... && goto main_menu || echo Timer: 2 prompt --key M --timeout 1000 Press M... && goto main_menu || echo Timer: 1 prompt --key M --timeout 1000 Press M... && goto main_menu || goto exit
Это менее красиво, но для boot script часто надёжнее, потому что iPXE-скрипты ограничены.
Ещё один момент:
promptвозвращает успех при нажатии нужной клавиши и неуспех по таймауту. Поэтому вся логика после||должна быть линейной и понятной. Если смешать несколько&&и||в одной строке, легко получить переход не туда, особенно в ограниченном синтаксисе iPXE.Итог: вынесите уменьшение счётчика в отдельную строку после
promptи проверьте синтаксисinc ctr -1именно для вашей версии iPXE. Если не работает, используйте развёрнутый таймер без переменной. Для boot-меню надёжность важнее красоты скрипта: пять явных шагов часто лучше, чем компактный цикл, который в вашей сборке iPXE интерпретируется иначе.