Как извлекать и обрабатывать записи постройки загрузки из Systemd-boot
Если вы когда-либо пытались работать с загрузочными записями в системах, использующих Systemd-boot
, вы, возможно, столкнулись с проблемой правильного извлечения и обработки этих записей. В этой статье мы обсудим процесс получения загрузочных записей с использованием PowerShell
и обработки результатов в пакетных сценариях Windows.
Проблема с извлечением записей
Для начала рассмотрим, как можно извлечь записи загрузки из Systemd-boot
. Используя следующий фрагмент кода, мы можем получить переменные загрузки через PowerShell
:
set NS="{4a67b082-0a4c-41cf-b6c7-440b29bb8c4f}"
set CMD="Get-UEFIVariable -Namespace \"%NS%\" -VariableName LoaderEntries"
powershell -ExecutionPolicy Bypass %CMD%
Запуск этой команды приводит к выводу, в котором записи кажутся объединенными в одну строку, по сравнению с тем, что это должно быть — списком записей, разделенных символом NUL
.
Примечание о разделителе
Сложность возникает из-за использования символа NUL
в качестве разделителя. Этот символ не отображается в стандартных редакторах и вызывает проблемы при последующем анализе вывода. Чтобы разобраться с полученными записями, необходимо преобразовать вывод в формат, удобный для обработки.
Чтобы разделить данные и сохранить каждую запись в отдельной переменной, можно использовать следующий цикл:
for /f "tokens=1* delims=NUL" %%F in ('powershell -ExecutionPolicy Bypass %CMD%') do set ENTRIES=%%F
echo %ENTRIES%
При запуске этого кода вы можете столкнуться с тем, что вывод отображает только одну запись, например, a
. Это указывает на необходимость пересмотра стратегии извлечения данных.
Решение с использованием больше комманд
Одним из эффективных решений является обработка вывода с помощью встроенной утилиты командной строки Windows — more.com
. Оптимизированный скрипт может выглядеть следующим образом:
@echo off
set /a _cnt=<nul +0
set "_NS={4a67b082-0a4c-41cf-b6c7-440b29bb8c4f}"
set "_CMD="Get-UEFIVariable -Namespace \"%_NS%\" -VariableName LoaderEntries""
for /f delims^= %%i in =;('
Powershell -ExecutionPolicy Bypass %_CMD% ^| "C:\Windows\System32\more.com"
');= do set /a "_cnt+=1" && <con: rem./ && call set "_out_%%_cnt%%=%%~i"
set _cnt=<nul & set _out_ & goto :eof
Этот код правильно обрабатывает вывод и создает переменные для каждой загруженной записи.
Доступ к созданным переменным
Чтобы получить доступ к созданным переменным, вы можете использовать цикл следующего вида:
for /L %%L in =;(1, 1, %_cnt%);= do call echo/%%_out_%%~L%%
Этот подход позволяет циклически обращаться ко всем переменным, которые были созданы, и выводить их на экран.
Заключение
Хотя процесс обработки загрузочных записей из Systemd-boot
может показаться сложным из-за использования неконтролируемых разделителей, приведенные примеры помогут вам правильно извлечь и обработать эти данные. Убедитесь, что ваши скрипты работают в корректных условиях, и не забудьте протестировать их в своей среде. Если у вас возникают проблемы, возможно, придется настроить их в зависимости от конфигурации вашей системы.