EFI shell 是否足够灵活以循环引导条目?

问题描述 投票:0回答:2

我正在尝试编写一个 EFI shell 脚本,该脚本会删除所有引导条目(如

bcfg dump boot
中所示),而不知道提前存在多少个引导条目。

该语言提供了一个循环构造,其模式来自于 Microsoft 的 shell:

for var in <set>
   ...
endfor

...但我不清楚是否有合理的方法将启动条目的数字标识符从

bcfg dump
获取到
<set>

uefi
2个回答
3
投票

目前(UEFI Shell v2.1 和 UEFI v2.50)无法使用 UEFI Shell 解析

bcfg
输出。

UEFI Shell 脚本中唯一支持的解析方法是使用

parse
命令,该命令需要
Standard-Format Output
(似乎是 CSV)。不幸的是,通过使用
SFO
标志作为参数,只有 7 个命令可以生成
-sfo
。支持的命令有:
ls
map
memmap
date
dh
devices
drivers

删除所有启动选项可以通过编写模仿 bcfg 行为的简单 C 应用程序来实现。我设法做到了这一点,并且可以在here找到示例代码。

请注意,删除所有启动选项在某些情况下可能很危险,并可能导致硬件状态无法恢复。确保你知道自己在做什么。


0
投票

鉴于此启动选项列表(在我的系统上),

FS0:\> bcfg boot dump
Option: 00. Variable: Boot0004
  Desc    - UEFI: Built-in EFI Shell
  DevPath - VenMedia(__ID__)
  Optional- Y
Option: 01. Variable: Boot0001
  Desc    - ubuntu
  DevPath - HD(1,GPT,__ID__,0x800,0x219800)/\EFI\UBUNTU\SHIMX64.EFI
  Optional- Y
Option: 02. Variable: Boot0005
  Desc    - Hard Drive
  DevPath - BBS(HD,)
  Optional- Y

我运行编辑

my.nsh
并输入以下几行脚本,

echo -off
bcfg boot dump 1>v entries
for %e in %entries%
  if /i %e == "variable:" then
    echo "Removing boot option %prev%"
    bcfg boot rm 0
  endif
  set -v prev "entry %e"
endfor

警告如果您尝试此操作,它将会删除您当前的启动选项:)

我运行了

my.nsh
,输出显示-

FS0:\> echo -off                 
Removing boot entry 00.
Removing boot entry 01.
Removing boot entry 02.

运行上述命令后..它们都消失了 -

FS0:\> bcfg boot dump
No options found.

这里的shell版本是-

FS0:\> ver            
UEFI Interactive Shell v2.2
EDK II
UEFI v2.80 (American Megatrends, 0x00050019)
© www.soinside.com 2019 - 2024. All rights reserved.