請選擇 進入手機版 | 繼續訪問電腦版

NoName Team 電腦資訊討論區

 找回密碼
 我要註冊
搜索
查看: 281|回復: 10

[已解決] 增加UEFI選單,但選單名稱無法更改

[複製鏈接]
發表於 2020-6-8 22:41:32 | 顯示全部樓層 |閱讀模式
本帖最後由 peeche 於 2020-6-11 15:30 編輯

Dear ALL,

     小弟寫了一個簡易的批次, 把PE放置C碟底下, 這個批次是成功可以崁入uefi的. 但是新增加的選單在去除Metro Bootloafer之後,

無論名稱Description怎樣改, 永遠只顯示Systemtool, 請教這該如何修改成正確想顯示的名稱. 下面附上批次檔, 煩請各位大大解惑.

另外請教, nx與pae是否可以拿掉, 小弟再觀察一些bcd好像沒有寫入這些選項

[Shell] 純文本查看 復制代碼
bootmenupolicy legacy
set bcd=%windir%\system32\bcdedit.exe
set    Label=c:
set /p Label=請輸入磁碟代號 (預設 c:):

:sdi
set    sdipath=\WinPE
set /p sdipath=請輸入sdi所在路徑 (預設:\WinPE):
set    sdifile=boot.sdi
set /p sdifile=請輸入sdi所在名稱 (預設:boot.sdi):

for /f %%i in ('dir /b %Label%%sdipath%^|find "%sdifile%"') do (set sdi=%%i)
if "%sdi%" == "%sdifile%" goto wim
echo.
echo ☆ 找不到SDI文件, 請重新輸入. ☆
echo.
goto SDI

:wim
@echo  ☆  找到 SDI 檔案  ☆
echo.
set    wimpath=\WinPE
set /p wimpath=請輸入wim檔案路徑 (預設:\WinPE):
set    wimfile=boot.wim
set /p wimfile=請輸入wim檔案名稱 (預設:boot.wim):

for /f %%w in ('dir /b %Label%%wimpath%^|find "%wimfile%"') do (set wim=%%w)
if "%wim%" == "%wimfile%" goto menu
echo.
echo ☆ 找不到WIM檔案, 請重新輸入. ☆
echo
goto wim

:menu
@echo  ☆  找到 WIM 檔案  ☆
echo.
set    menuname=Win10pe維修用
set /p menuname=請輸入開機選單名稱 (預設:Win10pe維修用):
set    menutime=5
set /p menutime=請輸入開機選單等待時間 (預設:5秒):
echo.
echo .sdi file : %Label%%sdipath%\%sdifile%
echo .wim file : %Label%%wimpath%\%wimfile%
echo 開機選單名稱 : %menuname%
echo 選單等候時間 : %menutime%
echo.
echo 確認無誤後, 按下任意鍵, 進行寫入BCD選單動作.
echo.
pause
%bcd% /create {ramdiskoptions} /d "SystemTool"
%bcd% /set {ramdiskoptions} ramdisksdidevice partition=%Label%
%bcd% /set {ramdiskoptions} ramdisksdipath %sdipath%\%sdifile%
%bcd% /create /d "System Tool" /application OSLOADER >%temp%\vol.txt
for /f "skip=2 delims==" %%m in ('find /i "已順利建立" "%temp%\vol.txt"') do set p=%%m
set vol=%p:~7,36%
%bcd% /set {%vol%} device ramdisk=[%Label%]%wimpath%\%wimfile%,{ramdiskoptions}
%bcd% /set {%vol%} osdevice ramdisk=[%Label%]%wimpath%\%wimfile%,{ramdiskoptions}
%bcd% /set {%vol%} description %menuname%
%bcd% /set {%vol%} systemroot \WINDOWS
%bcd% /set {%vol%} nx OptIn
%bcd% /set {%vol%} detecthal Yes
%bcd% /set {%vol%} pae ForceEnable
%bcd% /set {%vol%} winpe Yes
%bcd% /displayorder {%vol%} /addlast
%bcd% /timeout %menutime%
發表於 2020-6-11 02:18:18 | 顯示全部樓層
這個其實和 UEFI 沒關係吧...只是建立 BCD
如果你 windows 是用 UEFI 開機...就是去改 UEFI 的 BCD
反之 Legacy Bios 開機...就是去改 Legacy BCD

nx pae 就是看有沒有用到...
以目前的來說...大都用 win8 以上 x64 ... 支援都有 128G up... 基本用不到
https://docs.microsoft.com/zh-tw ... y_limits_windows_10

而且你是用 UEFI ...所以基本上會是 win8 以上 + x64
(因為 win7 uefi 有問題...uefi 大多又是 x64)

win x86 不支援 > 4G...才可能要用到 PAE

至於 BAT...除了啟動項少了以下設定...沒啥大問題
path                    \Windows\system32\winload.efi

至於 description 你是設啟動項 {%vol%}
所以 {ramdiskoptions} 的 description 永遠是 Systemtool

以下是測試情況 (我是有加 /store bcd 另外寫別的 bcd 測..除了沒 {bootmgr}...但基本上一樣)
Windows 開機載入器
-------------------
identifier              {30af82f6-ab46-11ea-ab55-309c23aefb87}
device                  ramdisk=[H:]\StarPo\Desktop\test\boot.wim,{ramdiskoptions}
description             Win10pe維修用
osdevice                ramdisk=[H:]\StarPo\Desktop\test\boot.wim,{ramdiskoptions}
systemroot              \WINDOWS
nx                      OptIn
pae                     ForceEnable
detecthal               Yes
winpe                   Yes

安裝 Ramdisk 選項
---------------------
identifier              {ramdiskoptions}
description             SystemTool
ramdisksdidevice        partition=H:
ramdisksdipath          \StarPo\Desktop\test\boot.sdi

發表於 2020-6-11 02:32:44 | 顯示全部樓層
本帖最後由 阿達金田一 於 2020-6-11 03:16 編輯

可以用
bcdedit /enum {fwboogmr}
來判斷是不是 UEFI ...不過我沒測過
但 Legacy/CSM 時應該是不會有 {fwboogmr} (或無法存取)

bcdedit /enum {fwboogmr}
正常 %errorlevel% 為 0
錯誤 %errorlevel% 為 1

set bcdpath=\Windows\system32\winload.efi
bcdedit /enum {fwboogmr}
if %errorlevel%==1 set bcdpath=\Windows\system32\winload.exe

後面設定時
%bcd% /set {%vol%} path %bcdpath%


下面是我電腦的 UEFI FW ...不是 BCD ... 別搞錯
PE 是用別的路徑 BOOTX64.EFI ... 啟動會用該路徑的BCD (所以預設的 BCD 是沒有 PE 啟動的)
C:\Windows\system32>bcdedit /enum {fwbootmgr}

韌體開機管理程式
---------------------
identifier              {fwbootmgr}
displayorder            {bootmgr}
                        {53a538b3-2f5c-11ea-aa59-806e6f6e6963}
                        {9280d2fd-38df-11ea-aa88-806e6f6e6963}
                        {9280d2fe-38df-11ea-aa88-806e6f6e6963}
                        {9280d2ff-38df-11ea-aa88-806e6f6e6963}
timeout                 1

C:\Windows\system32>bcdedit /enum {bootmgr}

Windows 開機管理程式
--------------------
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\MICROSOFT\BOOT\BOOTMGFW.EFI
description             Windows Boot Manager
locale                  zh-TW
inherit                 {globalsettings}
default                 {current}
resumeobject            {6cb232b6-2f57-11ea-a2d7-940ba9241149}
displayorder            {current}
toolsdisplayorder       {memdiag}
timeout                 30

C:\Windows\system32>bcdedit /enum {53a538b3-2f5c-11ea-aa59-806e6f6e6963}

韌體應用程式 (101fffff)
-------------------------------
identifier              {53a538b3-2f5c-11ea-aa59-806e6f6e6963}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\PE\BOOTX64.EFI
description             Windows PE

C:\Windows\system32>

 樓主| 發表於 2020-6-11 15:16:45 | 顯示全部樓層
本帖最後由 peeche 於 2020-6-11 18:17 編輯

感謝金大的精闢解說, 小弟立即在網路上搜尋了一下, 果然問題就是出在 {ramdiskoptions} 這一段,
於是將語法稍微更改了一下, 這樣就可以無限新增不同的名稱選單,


因為小弟對這塊不是很了解, 再請教金大所講得這一段,
set bcdpath=\Windows\system32\winload.efi
bcdedit /enum {fwboogmr}
if %errorlevel%==1 set bcdpath=\Windows\system32\winload.exe
UEFI 跟 MBR 是否就是取決於載入不同檔案 winload.efi 及 winload.exe
小弟拿台MBR的win10測試這段, %errorlevel%回傳依然是0
所以用 for指令 改寫了這段, 經實驗 UEFI 跟 MBR 都可以使用這批次,來增加 BCD 選單.

非常感謝金大的精闢解說

以下是小弟改好的 batch,

[Shell] 純文本查看 復制代碼
:start
set    Label=C:
set /p Label=請輸入磁碟代號 (預設 C:):
echo  ★ 輸入的磁碟代號 %Label%
echo.
rem ---------------------------------------------------------------------------------------

:rsdi
set    sdipath=WinPE
set /p sdipath=請輸入sdi所在路徑 (預設:WinPE):
for /f %%f in ('dir /b %Label%\^|find /i "%sdipath%"') do (set rsdi=%%f)
if "%rsdi%" == "%sdipath%" goto findsdif
echo.
echo  ☆ 輸入的目錄 %Label%%sdipath% 找不到, 請重新輸入. ☆
echo.
goto rsdi

:findsdif
echo  ★ 找到輸入的目錄 %Label%\%sdipath% 
echo.

:sdi
set    sdifile=boot.sdi
set /p sdifile=請輸入sdi所在名稱 (預設:boot.sdi):
for /f %%i in ('dir /b %Label%\%sdipath%^|find "%sdifile%"') do (set sdi=%%i)
if "%sdi%" == "%sdifile%" goto findsdi
echo.
echo  ☆ 該路徑 %Label%\%sdipath% 找不到 %sdifile% 檔案, 請重新輸入. ☆
echo.
goto SDI

rem ---------------------------------------------------------------------------------------
:findsdi
@echo  ★ 找到 %Label%\%sdipath%\%sdifile% 檔案 
echo.

:rwim
set    wimpath=WinPE
set /p wimpath=請輸入wim檔案路徑 (預設:WinPE):
for /f %%g in ('dir /b %Label%\^|find /i "%wimpath%"') do (set rwim=%%g)
if "%rwim%" == "%wimpath%" goto findwimfo
echo.
echo  ☆ 輸入的目錄 %Label%\%wimpath% 找不到, 請重新輸入. ☆
echo.
goto rwim

:findwimfo
echo  ★ 找到輸入的目錄 %Label%\%wimpath% 
echo.

:wim
set    wimfile=boot.wim
set /p wimfile=請輸入wim檔案名稱 (預設:boot.wim):
for /f %%w in ('dir /b %Label%\%wimpath%^|find "%wimfile%"') do (set wim=%%w)
if "%wim%" == "%wimfile%" goto findwim
echo.
echo  ☆ 該路徑 %Label%%wimpath% 找不到 %wimfile% 檔案, 請重新輸入. ☆
echo
goto wim

rem ---------------------------------------------------------------------------------------

:findwim
@echo  ★ 找到 %Label%\%wimpath%\%wimfile% 檔案 
echo.

:menu
set    menuname=Win10pe維修用
set /p menuname=請輸入開機選單名稱 (預設:Win10pe維修用):
echo  ★ 輸入的開機選單名稱 : %menuname%
echo.
set    menutime=5
set /p menutime=請輸入開機選單等待時間 (預設:5秒):
echo  ★ 輸入的選單等候時間 : %menutime%
echo.
echo.
echo   SDI 所在位置 : %Label%\%sdipath%\%sdifile%
echo   WIM 所在位置 : %Label%\%wimpath%\%wimfile%
echo   開機選單名稱 : %menuname%
echo   選單等候時間 : %menutime%
echo.
echo.
@echo Y.  進行寫入動作 ----- 按下 Y
@echo N.  重頭開始則 ------- 按下 N
@echo Q.  不想執行 --------- 請按 Q 離開
@echo. 
@choice /c:YNQ /t 20 /d Q /m 倒數20秒離開

if errorlevel 3 goto exit
if errorlevel 2 goto start
if errorlevel 1 goto bcd

:BCD
bcdedit /set {default} bootmenupolicy legacy
:bcdedit /set {default} bootmenupolicy standard
%bcd% /create /d "%menuname%" /device >%temp%\fdid.txt
  for /f "tokens=2 delims= "  %%i in (%temp%\fdid.txt) do (set p=%%i)
   set fdid=%p:~1,36%
%bcd% /set {%fdid%} ramdisksdidevice partition=%Label%
%bcd% /set {%fdid%} ramdisksdipath \%sdipath%\%sdifile%
%bcd% /create /d "%menuname%" /application OSLOADER >%temp%\vol.txt
  for /f "skip=2 delims==" %%m in ('find /i "已順利建立" "%temp%\vol.txt"') do set p=%%m
   set vol=%p:~7,36%
%bcd% /set {%vol%} device ramdisk=[%Label%]\%wimpath%\%wimfile%,{%fdid%}
%bcd% /set {%vol%} osdevice ramdisk=[%Label%]\%wimpath%\%wimfile%,{%fdid%}
%bcd% /set {%vol%} description "%menuname%"
%bcd% /set {%vol%} systemroot \WINDOWS
:%bcd% /set {%vol%} nx OptIn
%bcd% /set {%vol%} detecthal Yes
:%bcd% /set {%vol%} pae ForceEnable
%bcd% /set {%vol%} winpe Yes

 set bcdpath=\Windows\System32\Winload.exe
  for /f %%a in ('bcdedit /enum {fwbootmgr}^|find "timeout"') do ( 
   set bcdpath=\Windows\System32\Winload.efi
  )
 %bcd% /set {%vol%} path %bcdpath%

%bcd% /displayorder {%vol%} /addlast
%bcd% /timeout %menutime%
%bcd%

pause
:exit
exit




發表於 2020-6-11 23:10:06 | 顯示全部樓層
本帖最後由 阿達金田一 於 2020-6-15 12:19 編輯

理論上 bcdedit /enum xxxxx
當後面的項目不存在時... bcdedit 會傳錯誤碼 給 %errorlevel%
大部份 有回傳錯誤碼 的 cmd 指令...大多這樣...
0 無錯誤...非0 有錯誤
像 dir 指令也是這樣...
而這類指令還可在後面接  && 或 ||  來判斷 無錯 有錯 時執行其它指令
(當 && || 同時用時... && 要在前面)
例如
>nul dir xxxx && echo 1 || echo 2
當 dir 目標
(dir無誤)存在時... echo 1
(dir錯誤)不存在... echo 2

所以如果 bcdedit 找不到 {fwbootmgr}
正常 %errorlevel% 應該會 1 或 非0
( 非0 可能要用 if %errorlevel% neq 0...不過我測試時...錯誤都給1...所以就用 if %errorlevel%==1 )

注意 {fwbootmgr} 比較特殊...這是指 uefi fw ...所以應該不是儲存於 bcd ...而是存在 BIOS
在 legacy/csm 下...bcdedit 理論上應該是無法存取 {fwbootmgr}
因為這個實際上應該是會用到 UEFI 功能來去存取...所以 legacy/csm 應該無該功能無法使用


set bcdpath=\Windows\System32\Winload.exe
  for /f %%a in ('bcdedit /enum {fwbootmgr}^|find "timeout"') do (
   set bcdpath=\Windows\System32\Winload.efi
  )
%bcd% /set {%vol%} path %bcdpath%

其實也是看有沒有 {fwbootmgr}
所以正常來說...若沒有 {fwbootmgr} ... bcdedit 指令錯誤碼會 非0

判斷 errorlevel 最好是接在要判斷的指令後...
因為不知道會不會有別的指令會蓋過去

你可以試著另寫一個 bat 測試
bcdedit /emum {fwbootmgr}
echo %errorlevel%
看一下 errorlevel 值

或是用
set bcdpath=\Windows\System32\Winload.
>nul bcdedit /enum {fwbootmgr} && set bcdpath=%bcdpath%efi || set bcdpath=%bcdpath%exe

C:\Windows\system32>set bcdpath=\Windows\System32\Winload.

C:\Windows\system32>>nul bcdedit /enum {fwbootmgr} && set bcdpath=%bcdpath%efi || set bcdpath=%bcdpath%exe

C:\Windows\system32>set bcdpath
bcdpath=\Windows\System32\Winload.efi

C:\Windows\system32>set bcdpath=\Windows\System32\Winload.

C:\Windows\system32>>nul bcdedit /enum {XXXXXXXXX} && set bcdpath=%bcdpath%efi || set bcdpath=%bcdpath%exe

C:\Windows\system32>set bcdpath
bcdpath=\Windows\System32\Winload.exe

如果 bcdedit 在 legacy/csm 下 /enum {fwbootmgr} 時...傳回錯誤碼有問題還是 0
可以改用
set bcdpath=\Windows\System32\Winload.
bcdedit /enum {fwbootmgr}|find "{fwbootmgr}" >nul && set bcdpath=%bcdpath%efi || set bcdpath=%bcdpath%exe
註...
這裡是 find 指今 無/有錯誤...不是 bcdedit
bcdedit 把輸出給 find 處理... 所以最後是 find 有/無錯誤 ... errorlevel 也是 find 的
C:\Windows\system32>set bcdpath=\Windows\System32\Winload.

C:\Windows\system32>bcdedit /enum {fwbootmgr}|find "{fwbootmgr}" >nul && set bcdpath=%bcdpath%efi || set bcdpath=%bcdpath%exe

C:\Windows\system32>set bcdpath
bcdpath=\Windows\System32\Winload.efi

C:\Windows\system32>set bcdpath=\Windows\System32\Winload.

C:\Windows\system32>bcdedit /enum {fwbootmgr}|find "{xxxxxxxxx}" >nul && set bcdpath=%bcdpath%efi || set bcdpath=%bcdpath%exe

C:\Windows\system32>set bcdpath
bcdpath=\Windows\System32\Winload.exe

另外有些指令...是 無錯誤碼...
例如 echo 和 set ...因為通常都不會失敗...(但 指令錯誤 時還是會有 錯誤碼...只是成功時 無錯誤碼)
錯誤碼 0 是有錯誤碼(迴傳0)...但 0 表示沒錯誤
錯誤碼 非0 是有錯誤碼(迴傳 非0)...有錯誤
無錯誤碼 是 沒有 錯誤碼 寫入 errorlevel (沒有迴傳任何 錯誤碼)...通常是 沒有錯誤
無錯誤碼 情況下...無法用 errorlevel 來判斷 ...通常用 && 來判斷
因為有迴傳 非0 錯誤碼 時... || 成立
反之 && 成立 ...所以 錯誤碼0 或 無錯誤碼 && 都是成立的

C:\Windows\system32>dir /b cmd.exe
cmd.exe

C:\Windows\system32>echo %errorlevel%
0

C:\Windows\system32>dir /b abc
找不到檔案

C:\Windows\system32>echo %errorlevel%
1

C:\Windows\system32>set a=123

C:\Windows\system32>echo %errorlevel%
1

C:\Windows\system32>dir /b cmd.exe
cmd.exe

C:\Windows\system32>echo %errorlevel%
0

C:\Windows\system32>set /p && echo set /p ok || echo set /p error
命令語法不正確。
set /p error

C:\Windows\system32>echo %errorlevel%
1

可以看到 dir /b abc 錯誤 errorlevel = 1 後
即時 set a=123 無錯誤 也無錯誤碼迴傳 ... errorlevel 還是 1
但 set /p 指令錯誤時...有迴傳 錯誤碼 1
C:\Windows\system32>set /p a=set /p input test: && echo ok || echo Ctrl+C
set /p input test: 123
ok

C:\Windows\system32>set /p a=set /p input test: && echo ok || echo Ctrl+C
set /p input test: Ctrl+C

C:\Windows\system32>

發表於 2020-6-12 00:17:52 | 顯示全部樓層
本帖最後由 阿達金田一 於 2020-6-12 00:27 編輯

另外...你有個地方搞錯...不是 UEFI 和 MBR
MBR 是Disk分割表...所以是 GPT 和 MBR 的分別 , UEFI 和 Legacy 的分別
也就是 UEFI 一樣也可以用 MBR 開機 (Legacy 亦可以用 GPT 開機)

{fwbootmgr} 是指 FirmWare Boot Manager  韌體開機管理程式
是 韌體 和 disk分割表 沒有關係
不會因為你用 MBR 就變成 Legacy/CSM

只是 windows 預設安裝 UEFI  會用 GPT , Leagcy 會用 MBR
UEFI 一樣可用 MBR 啟動 windows
但 Leagcy 因為 legacy bootmgr 問題, 無法直接用 GPT 開機(但還是可以只是要加工)
(我以前有發過 legacy 用 GPT 啟動 win7 x86 的文章)

而 Legacy/CSM 正常來說並沒有 {fwbootmgr}
{fwbootmgr} 可算是獨屬 UEFI
(用 bootice 改 UEFI 開機...其實就是  {fwbootmgr} )
所以 {fwbootmgr} 基本上等於 UEFI FirmWare Boot Manager

所以 bcdedit /enum {fwbootmgr} 是看
目前 windows 是否能 存取 UEFI FW 來判斷
windows 本身是否是用 UEFI 來啟動 ...
如果不是...那就是 Legacy 啟動 ... 和 GPT / MBR 沒關係

UEFI 開機...不管Disk 是 GPT 或 MBR
path 都是 \Windows\system32\winload.efi
反之...
Legacy 開機...不管Disk 是 GPT 或 MBR
path 都是 \Windows\system32\winload.exe
 樓主| 發表於 2020-6-15 10:17:02 | 顯示全部樓層
感謝金大的教學,小弟測試下有些 errorlevel 跟金大給的有點異常

set bcdpath=\Windows\System32\Winload.
>nul bcdedit /enum {fwbootmgr} && set bcdpath=%bcdpath%exe || set bcdpath=%bcdpath%efi

在 Legacy/CSM 下, erroelevel = 1 , 要反過來 EXE 跟 EFI 才會正常.

關於 errorlevel 這個非常感謝金大的解釋, 所以小弟一下就看得出來問題在哪裡.

另外還有一些寫法, 讓小弟又學到一些, 不一樣的判斷方式.


再次感謝
發表於 2020-6-15 12:08:04 | 顯示全部樓層
本帖最後由 阿達金田一 於 2020-6-15 14:36 編輯
peeche 發表於 2020-6-15 10:17
感謝金大的教學,小弟測試下有些 errorlevel 跟金大給的有點異常

set bcdpath=\Windows\System32\Winload. ...

Legacy/CSM 下 errorlevel =1  這是對的
這表示是有錯誤碼...也就是 {fwbootmgr} 不存在

>nul bcdedit /enum {fwbootmgr} && set bcdpath=%bcdpath%exe || set bcdpath=%bcdpath%efi
有錯誤...應該是執行 || 後面 set bcdpath=%bcdpath%efi
但無 {fwbootmgr} 時 errorlevel=1 表示 Leagcy/CSM
應該要用 set bcdpath=%bcdpath%exe 才對
也就是我原本的寫法才是對的...

而且你前面是說
小弟拿台MBR的win10測試這段, %errorlevel%回傳依然是0

所以我才推測...你那台MBR 還是用 UEFI 開機...所以 errorlevel = 0
而正常 Legacy/CSM errorlevel 會是 = 1

正常 UEFI


所以從頭到尾...我應該是沒有說錯(打字應該也沒打錯...)
反而是你測試的情況..我搞不太清楚
而且我也不覺的 cmd 測試會不一樣...
感覺是你搞反了狀態...例如
明明是 UEFI ...只是因為是用 MBR 你以為是 Leagcy ... 但其實是 UEFI
而 UEFI {fwbootmgr} 存在...所以 errorlevel=0

不管是最早的 ... 這是以 errorlevel 來判斷 ( legacy/csm errorlevel=1 所以我原本寫的沒錯...是你說你這樣會不對...)
set bcdpath=\Windows\system32\winload.efi
bcdedit /enum {fwboogmr}
if %errorlevel%==1 set bcdpath=\Windows\system32\winload.exe

後來的
以 bcdedit 是否有傳回錯誤來判斷
set bcdpath=\Windows\System32\Winload.
>nul bcdedit /enum {fwbootmgr} && set bcdpath=%bcdpath%efi || set bcdpath=%bcdpath%exe

以 find 是否有傳回錯誤來判斷 (找不到 find 找不到 {fwbootmgr} 時錯誤)
set bcdpath=\Windows\System32\Winload.
bcdedit /enum {fwbootmgr}|find "{fwbootmgr}" >nul && set bcdpath=%bcdpath%efi || set bcdpath=%bcdpath%exe

和你之前自己寫的 ... 用 find 找...只是是用 for do 來判斷+執行
set bcdpath=\Windows\System32\Winload.exe
  for /f %%a in ('bcdedit /enum {fwbootmgr}^|find "timeout"') do (
   set bcdpath=\Windows\System32\Winload.efi
  )
%bcd% /set {%vol%} path %bcdpath%

以上都是 {fwbootmgr} 存在時 set bcdpath=\Windows\System32\Winload.efi
差別是...我的主要是以 指今 錯誤碼 或 是否傳回錯誤 來判斷
也就是以上幾個結果應該都一樣...

除非你 bcdedit 指令情況和我完全相反...
我的是
{fwbootmgr} 存在 errorlevel=0  執行 &&
{fwbootmgr} 不存在 errorlevel=1 執行 ||
不然我的指令應該是沒錯...
我唯一無法確定的是...我手邊電腦只有 UEFI
所以無法確定 Legacy/CSM ... 是不是真的無法 bcdedit /enum {fwbootmgr}
CSM 畢竟是 UEFI 模擬...我用過的電腦不是 Legacy 就是 純UEFI... 沒用過 UEFI CSM


另外... bcdedit 因為會修改 bcd 所以...bat 一定要用 系統管理員 執行
不然你 bcdedit 無論指令怎麼下...一定是錯誤... errorlevel=1
因為不用 系統管理員 bcdedit 不能存取 系統bcd ... 所以一定會出錯


BAT 自動以 系統管理員執行 可以參考
https://inonameteam.com/thread-5025-1-1.html

我的方式要用到 mshta 所以 PE 下一般不行, 只能在 win 中跑
而樓主的是用 cscript/wscript , 如果 PE 沒閹割掉可以跑

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?我要註冊

x
發表於 2020-6-15 14:23:25 | 顯示全部樓層
本帖最後由 阿達金田一 於 2020-6-15 14:26 編輯

測試 fwbootmgr.bat
goto :test1 可自行修改成
goto :test2
goto :test3

[Shell] 純文本查看 復制代碼
@echo off
>nul 2>&1 REG QUERY "HKU\S-1-5-19" && goto AdmRun
if defined ADMRun goto AdmErr
set ADMRun=1
set arg= %*
if exist "%windir%\system32\mshta.exe" goto :mshta
if exist "%windir%\system32\cscript.exe" goto :wscript
if exist "%windir%\system32\wscript.exe" goto :wscript
goto AdmErr
:wscript
>"%temp%\ADMRun.vbs" echo createobject("shell.application").shellexecute "cmd.exe","/c """"%~f0""%arg:"=""%""","","runas",1
"%temp%\ADMRun.vbs"
del "%temp%\ADMRun.vbs"
exit/b
:mshta
mshta vbscript:createobject("shell.application").shellexecute("cmd.exe","/c """"%~f0""%arg:"=""%""","","runas",1)(close)
exit/b
:AdmErr
echo BAT Can not Auto Run as ADM , please Run as ADM DIY
pause
:AdmRun

goto :test1

:test1
>nul bcdedit /enum {fwbootmgr}
if %errorlevel%==0 goto :fwbootmgr
goto :fwbootmgrErr

:test2
>nul bcdedit /enum {fwbootmgr} && goto :fwbootmgr || goto :fwbootmgrErr

:test3
bcdedit /enum {fwbootmgr}|find "{fwbootmgr}" && goto :fwbootmgr || goto :fwbootmgrErr

:fwbootmgr
echo errorlevel = %errorlevel%
echo {fwbootmgr} found.
bcdedit /enum {fwbootmgr}
pause
exit/b

:fwbootmgrErr
echo errorlevel = %errorlevel%
echo {fwbootmgr} not found.
pause
exit/b
 樓主| 發表於 2020-6-15 22:15:13 | 顯示全部樓層
金大 請教如何把圖貼上去 不然光是講解 就要花好多時間
您需要登錄後才可以回帖 登錄 | 我要註冊

本版積分規則

小黑屋|手機版|NoName Team 電腦資訊討論區 |網站地圖

GMT+8, 2020-7-3 06:47 , Processed in 0.097525 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表