|
本帖最后由 hlowld 于 2024-5-17 16:09 编辑
我理解楼主的意思是,在UEFI启动序列里,希望用自己喜欢的启动器(例如grub/refind等),但windows系统有时会强行把UEFI启动序列改为ESP下 EFI\Microsoft\Boot\bootmgfw.efi
我也遇到过相同问题,我希望UEFI序列里默认执行grub4dos UEFI,在menu.lst里写几个引导项,例如
bootmgfw.efi(defaut)
WePE_64_V2.3.iso
ventoy.vhd
...
这样就很灵活,想进什么进什么,当然如果最常用windows,就默认进bootmgfw.efi
我的办法是:将微软原版bootmgfw.efi改名为bootmgfw.efi1,用grub4dos UEFI的BOOTX64.EFI替换bootmgfw.efi
但我经常安装windows系统到vhdx文件里,不管你用什么工具来安装(例如winntsetup/dism/dism++/wimlib-imagex),文件释放后,调用bcdboot添加启动项到BCD是最简单的,但bcdboot会做两个事情,一是将新系统添加到BCD启动项,二是用新系统\windows\boot\EFI\下的bootmgfw.efi及其对应的mui文件替换ESP下 EFI\Microsoft\Boot\bootmgfw.efi,这就让我的办法失效了。
解决办法也很简单,安装系统时,重启前,重新用grub4dos UEFI的BOOTX64.EFI替换bootmgfw.efi即可。
当然,搞多了就写成批处理了,分享一下我安装系统的批处理供参考
@ECHO OFF & PUSHD "%~DP0" & setlocal ENABLEDELAYEDEXPANSION
fltmc>nul||mshta vbscript:CreateObject("Shell.Application").ShellExecute("%~dpnx0","%*",,"runas",1)(window.close)&&exit
if exist Z: echo Z盘已存在,请先弹出 Z 盘 & pause & goto end
set "dir=\\?\globalroot\Device\HarddiskVolume2\"
:want_lbl
set "lbl=" & set /p lbl=请输入系统标识(例如 Win11pro):
if "%lbl%" == "" goto want_lbl
set "file=%lbl%.vhdx"
if exist "%dir%%file%" ( echo 该标识已被占用,请重新输入 & goto want_lbl )
echo 即将创建并挂载 "%dir%%file%" 为 Z 盘
pause
echo.
(
echo create vdisk file="%dir%%file%" maximum=40960 type=expandable
echo select vdisk file="%dir%%file%"
echo attach vdisk
echo convert gpt
echo create partition primary
timeout /t 1 /nobreak
echo assign letter=Z
echo format fs=ntfs quick label="%lbl%"
) | diskpart >nul || (echo 创建挂载VHD失败 & goto end)
echo 已成功创建并挂载 "%dir%%file%" 为 Z 盘,请在WinNTSetup中选择正确的 “操作系统版本”
pause
"%~dp0winntsetup_x64.exe" nt6 /tempdrive:Z: /compact:xpress4k /regTweaks:win11 /noBootSect /bcd:UEFI /timeout:2 /setup /silent || (echo WinNTSetup 执行失败 & goto end)
call :activate_grub
echo 完成
:end
pause & exit
:activate_grub
for /f "delims=" %%i in ('powershell -Command "Get-CimInstance Win32_OperatingSystem | Select-Object -ExpandProperty BootDevice"') do set "BootDevice=%%i"
copy "\\?\GLOBALROOT%BootDevice%\EFI\grub\bootx64.efi" "\\?\GLOBALROOT%BootDevice%\EFI\microsoft\boot\bootmgfw.efi" /y
goto :eof
|
|