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

NoName Team 電腦資訊討論區

 找回密碼
 我要註冊
搜索
查看: 475|回復: 5

[問題] cmd 判定 BISO/UEFI 現在開機環境執行

[複製鏈接]
發表於 2021-8-16 14:33:28 | 顯示全部樓層 |閱讀模式
cmd 判定 BISO/UEFI 現在開機環境執行
如下方 判定x86 或 x64 執行Ghost


@ECHO OFF
if /i "%PROCESSOR_IDENTIFIER:~0,3%" == "X86" goto 86
GHOST64 -split=0
exit
:86
GHOST32 -split=0
exit



請問cmd 命令如何寫

發表於 2021-8-18 06:39:55 | 顯示全部樓層
本帖最後由 阿達金田一 於 2021-8-18 06:57 編輯
pinko 發表於 2021-8-17 18:42
簡單叫用powershell試試 ?
for /F %%i in ('powershell.exe  "$env:firmware_type"') DO goto %%i
egacy ...

又學到一招
樓上你突破盲點了...你這招有簡單到...而且也不用 powershell
因為你用 $env:firmware_type
這不就是取環境變數嗎...CMD 下應該也可以用

我試了在 CMD 下 echo %firmware_type% 可以用
但測試時 win7 setup pe 下不行... win8.1 setup pe 可以
所以推測大概也是用了 API GerFirmwareType ...所以可能只能在 win8 後使用

不過...說真的...google %firmware_type%
有效資料真的不多 ... 幾乎可以算沒有了
大多是其它資料(和 API 有關的 FIRMWARE_TYPE 資料型態)

google $env:firmware_type 反而還有資料

測試了一下
%firmware_type% 大概是和 %cd% %date% %time% 類似的 隱系統環境變數
set firmware_type
會顯示未定義
但 echo %firmware_type% 還是會顯示 Legacy/UEFI

這招雖然 win7 以前的都沒法支援...
不過 win7 以前的基本都是用 Legacy...所以足夠應付大多情況使用
如果要 XP~win7 也可以用...還是要用 API
( EFI 是 XP 才開始有的 )

BAT 寫法 ...
@ECHO OFF
if /i "%firmware_type%" == "UEFI" goto :UEFI

xxxxx
exit

:UEFI
xxxxx
exit

發表於 2021-8-17 05:39:19 | 顯示全部樓層
本帖最後由 阿達金田一 於 2021-8-17 08:29 編輯

之前在別的主題...也有遇到有這需求的問題
https://inonameteam.com/forum.php?mod=viewthread&tid=5883&fromuid=211

用 bat 判斷 uefi 其它還真的不太方便
如果可以 最好還是用可以判斷 UEFI/BIOS 的  Console 程式
把判斷結果丟給 BAT 用 會比較方便和精準

網上可以 google 到很多方法
其實基本上都是用了其它程式來判斷
例如
用 bcdedit 來判斷
但 bcdedit 嚴格來說 其實也不完全是 判斷當前環境
因為 bcdedit 是用 系統啟動分區 和 系統BCD  ( 而不是 PE 啟動分區 和 BCD )
所以如果是用 bcdedit /enum {current} 來判斷 winload.exe 或 winload.efi
在 PE 下判斷可能就不正確 因為可能不會有 {current}
( 除非你 PE 是用 系統啟動分區BCD 來啟動的 )
而用 bcdedit /enum {fwbootmgr} 倒是可以  ( 因為這是判斷 FireWare )
但前提是 系統啟動分區 和 系統BCD 要存在而且是正常的
因為 bcdedit 是先檢查 系統啟動分區 和 系統BCD ...
所以如果這2個有問題... bcdedit 就直接 error 結束了...也不會去查看 {fwbootmgr}

其它像 PE 下判斷的方式
https://docs.microsoft.com/zh-tw/windows-hardware/manufacture/desktop/boot-to-uefi-mode-or-legacy-bios-mode
wpeutil UpdateBootInfo
for /f "tokens=2* delims=    " %%A in ('reg query HKLM\System\CurrentControlSet\Control /v PEFirmwareType') DO SET Firmware=%%B
:: Note: delims is a TAB followed by a space.
if %Firmware%==0x1 echo The PC is booted in BIOS mode.
if %Firmware%==0x2 echo The PC is booted in UEFI mode.

其實一樣還是用了 wpeutil UpdateBootInfo 來產生 Firmware 資料...再用 reg 和 bat指令 判斷




要比較準確判當前的 UEFI/BOIS...最好還是用 WinAPI

GetFirmwareEnvironmentVariable
XP ~ win8.1 適用 ( win10 要用比較麻煩...有程式即時權限問題 )

GetFirmwareType
win8 後適用 ... 沒程式權限問題

例如
我自己寫的 FwType.au3 ( 編譯成 console exe )
Console 和 ExitCode 會回傳
1  Legacy
2  UEFI
其它  Unknown
#pragma compile(Console, true)
#include <WinAPI.au3>

Func FwType1()
    DllCall("Kernel32.dll", "dword", "GetFirmwareEnvironmentVariableW", "wstr", "", "wstr", '{00000000-0000-0000-0000-000000000000}', "wstr", Null, "dword",0)
    Switch _WinAPI_GetLastError()
        Case    1
            Return 1
        Case    998
            Return 2
        Case Else
            Return 0
    EndSwitch
EndFunc

Func FwType2()
    Local $aCall = DllCall("Kernel32.dll", "int", "GetFirmwareType", "int*", 0)
    If Not @error And $aCall[0] Then Return $aCall[1]
    Return SetError(1, 0, 0)
EndFunc

$ret=0
Switch @OSVersion
    Case "WIN_7", "WIN_VISTA", "WIN_XP", "WIN_XPe", "WIN_2008R2", "WIN_2008", "WIN_2003"
        $ret=FwType1()
    Case Else
        $ret=FwType2()
EndSwitch
ConsoleWrite($ret&@CRLF)
Exit $ret



bat 用 bcdedit 和 wpeutil.exe ( 前題是 bcdedit 和 wpeutil 都可以正常執行)
另外 wpeutil UpdateBootInfo 推測是用 WinAPI GetFirmwareType 來判斷 FirmwareType
所以在 7pe , wpeutil UpdateBootInfo 無效
@echo off

call :FwType

echo %Firmware%
if %Firmware% EQU 1 echo Legacy BIOS
if %Firmware% EQU 2 echo UEFI
exit/b


REM FwType SUB
:FwType
set Firmware=0
if /i "%windir%"=="X:\Windows" (call :FwPE) else (call :FwWin)
exit/b

:FwWin
>nul bcdedit /enum {bootmgr} || exit/b
>nul bcdedit /enum {fwbootmgr} && set Firmware=2 || set Firmware=1
exit/b

:FwPE
if exist "%windir%\system32\wpeutil.exe" wpeutil UpdateBootInfo
for /f "tokens=2*" %%a in ('reg query HKLM\System\CurrentControlSet\Control /v PEFirmwareType') do set /a Firmware=%%b
exit/b
REM FwType SUB END

發表於 2021-8-17 10:45:33 | 顯示全部樓層
最好調用WinAPI去判斷
 樓主| 發表於 2021-8-17 17:50:33 | 顯示全部樓層
阿達金田一 發表於 2021-8-17 05:39
之前在別的主題...也有遇到有這需求的問題
https://inonameteam.com/forum.php?mod=viewthread&tid=5883&fr ...

我是想用cmd 判斷是 Legacy BIOS / UEFI 開機
自動 對應改寫BOOT / EFI     BCD 增加開機選項

PE下 或 Win 都可
發表於 2021-8-17 18:42:25 | 顯示全部樓層
本帖最後由 pinko 於 2021-8-17 18:45 編輯
j120163392 發表於 2021-8-17 17:50
我是想用cmd 判斷是 Legacy BIOS / UEFI 開機
自動 對應改寫BOOT / EFI     BCD 增加開機選項

簡單叫用powershell試試 ?
for /F %%i in ('powershell.exe  "$env:firmware_type"') DO goto %%i
:Legacy

echo "Legacy"

goto end

:UEFI

echo "UEFI"

:end
您需要登錄後才可以回帖 登錄 | 我要註冊

本版積分規則

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

GMT+8, 2021-9-27 06:34 , Processed in 0.180022 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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