|
楼主 |
发表于 2019-3-25 09:36:16
|
显示全部楼层
本帖最后由 dos时代菜鸟 于 2019-3-25 10:20 编辑
刚才测试了下 win10 的 bcd 没有 path 的情况
leagy uefi 模式下 启动项不指定 "path = ....winload.exe" 都可以启动
值得一提的是 uefi 模式下 会在 {bootmgr} 项目中增加一个 path 并指定 bootmgrfw.efi 作为启动 bcd 的引导器,即便把 {bootmgr} 中的这个 path 删掉,系统也会在启动的时候 加上,运行 "bcdedit /enum “也会自动加上.
不知道是否是个例,还是普遍现象,如果普遍如此,就可以据此判断系统是否为 uefi 模式启动了。
也就是如果 {bootmgr} 项中 有定义 path 且其指向一个 .efi 文件,就说明是 uefi 启动。否则就是 leagy-bios 模式启动。???
似乎也不妥,如果用 bcdedit /deletevalue 的方式删除 {bootmgr} 中的 path ,系统就不会 回填 path 值了。
而且 leagy-bios 模式 下,bcd 中{bootmgr} 的path 没啥用,如果 leagy-bios中 {bootmgr}的path值乱写,也会影响判断。
如下图,{bootmgr} 项目中 path 已经删除,运行 bcdedit 还是会 自动把 path 加上。重启也会。
- @echo off
- setlocal ENABLEDELAYEDEXPANSION
- set /a n=0
- set /a current_n=-1
- set /a bootmgr_n=-1
- for /f "tokens=1* delims= " %%a in ('bcdedit /enum ') do (
- set "lx=%%a" & if /i "!lx:~0,1!"=="-" set /a n+=1
- set "!n!_%%a=%%b"
- if /i "%%b"=="{current}" (set /a current_n=!n!)
- if /i "%%b"=="{bootmgr}" (set /a bootmgr_n=!n!)
- )
- set "boot_mode=Legacy-BIOS"
- IF defined !bootmgr_n!_path (
- for %%c in (!bootmgr_n!) do ( for %%q in (!%%c_path!) do (
- if /i "%%~xq"==".efi" set "boot_mode=UEFI"
- ))
- )
- ECHO.
- ECHO BCD启动项列表(!boot_mode!):
- for /l %%n in (1,1,!n!) do (
- set "item_type="
- if %%n equ !current_n! ( set "item_type={Current}")
- if %%n equ !bootmgr_n! ( set "item_type={Bootmgr}")
- echo ---%%n---!item_type!------------
- for %%a in (description,device,systemroot,path) do (
- set "lx= %%a" & set "lx=!lx:~-12!"
- if defined %%n_%%a echo !lx! : "!%%n_%%a!"
- )
- )
- ECHO ---------------------------
- echo.
- pause
复制代码 |
|