Как выполнить анализ строк, заканчивающихся NUL, в пакетном сценарии?

Как извлекать и обрабатывать записи постройки загрузки из 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 может показаться сложным из-за использования неконтролируемых разделителей, приведенные примеры помогут вам правильно извлечь и обработать эти данные. Убедитесь, что ваши скрипты работают в корректных условиях, и не забудьте протестировать их в своей среде. Если у вас возникают проблемы, возможно, придется настроить их в зависимости от конфигурации вашей системы.

Источник

Ответить

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