Как реализовать вывод обратного отсчета в iPXE?

Ссылка скопирована
pxe
1 ответ
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
Антон С. Ответ

В 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
 
:end

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 :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

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 интерпретируется иначе.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно