无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 15743|回复: 53
打印 上一主题 下一主题

[求助] 如何用批处理判断Bios是否支持UEFI启动?

  [复制链接]
跳转到指定楼层
1#
发表于 2017-12-22 19:11:19 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 quya 于 2018-1-13 10:01 编辑

这个问题问得可能有点大,而且要精确判断比较困难。

在自动分区并想把硬盘格式化的时候,想到了我应该用MBR传统分区呢还是GPT分区?

我初步的设想是获得BIOS版本号或者日期,在2011年之后的大概可以用GPT分区,或者保险点2012年。

一个最容易想到的命令是 systeminfo, 然后提取Bios版本号最后几位数字,就知道是那一年的,其次是wmic命令。

但上述命令在很多PE下是不支持的,所以我认为既然得到精确的判断很困难,我索性再模糊一点,用CPU型号来大致判断机器的新旧。

比如 set 命令, 获取PROCESSOR_REVISION 参数, 对intel CPU 而言,如果是参数3xxx,那么应该能支持GPT(我猜测的,不对的情况请大家指正), 但对AMD CPU, 我不知道数字是什么。 能够判断的几个变量还有PROCESSOR_IDENTIFIER等,但最直观的我觉得还是PROCESSOR_REVISION 参数, 为此我在网上搜索了下, 但无法得到有效的数据。

所以,请大家八仙过海,各显神通, 如何简单地实现我标题所说的问题, 不求精确,只求简单,通用性强。

另, 有无简单办法判断机器内存大小? 同样需要通用性。


下面很多人问我要这样做干嘛, 如果只是偶尔装个系统,当然用不着这么复杂,但在大量部署系统的时候就用得着了,所以进bios看一看什么的没什么实际意义, 懂bios的人还要什么批处理, 大多数批处理就是在即使非专业的人操作之下,也不会有什么大的错误。 所以批处理是我做的, 但用的人可能连怎么进BIOS都不知道。

各位原意帮忙的我十分感谢, 但无法帮忙的请不要说这样做毫无意义等这样的话, 我不想再浪费时间辩解这样做是否有意义, 我只是需要方法。 退一万步说, 我要这样的代码纯粹只是自娱自乐, 行吗?


根据大家的意见,目前代码如下:

  1. set isUEFI=False
  2. bcdedit /enum {current} |find "winload.efi">nul 2>&1 &&set isUEFI=True
  3. if %PROCESSOR_REVISION:~0,1% gtr 2 set isUEFI=True
复制代码


以上代码对intel CPU来说, 应该有90%的准确率, 当%PROCESSOR_REVISION:~0,1% ==2 的时候, 有部分支持UEFI,这部分只好放弃判断。

有谁有AMD的资料?

一个需要技巧和资料方面的批处理, 却变成了讨论其他问题, 难道大家都乐意回答一些初级问题?我就不信无忧启动论坛会差到这种地步。

有坛友在三楼就已经明白了我的意思, 但很多坛友却还在讨论“如何判断当前系统是否是UEFI启动”, 这儿再重复一下,我的求助主题指的是BIOS(或者说机器),不是系统。


如果PE支持Systeminfo命令, 我自然不必大费周章(见下列代码,可以得出bios生产日期,假如值大于2011年,那么基本支持UEFI), 这就是为什么我寻找更通用代码的原因, 也算是一个挑战吧。

  1. for /f "tokens=1,2 delims=:" %i in ('systeminfo') do if "%i"=="BIOS 版本" set "biosver"="%j" &echo %biosver:~-10,4%
复制代码
42#
发表于 2018-5-22 20:25:55 | 只看该作者
谢谢分享,收藏备用
回复

使用道具 举报

41#
发表于 2018-5-13 17:04:46 | 只看该作者
微软直接有判断是否UEFI并自动分区的脚本呀
回复

使用道具 举报

40#
 楼主| 发表于 2018-1-30 16:41:50 | 只看该作者
lintrainwy 发表于 2017-12-22 19:53
判断Bios支不支持不好办,最好是进BIOS去看,但是判断当前启动方式比较简单

经过最后测试, PE中根本没有BCD文件

所以命令 bcdedit 因为找不到配置文件出错, 更不用说 bcdedit /enum {current}, 整个都没有,当然也无 {current}

至少我测试了2个pe都是如此

不过也好, 这样根据测试的错误结果, 可以判定本系统是否是“PE”, 再结合 %username%==system, 基本可判定当前系统是PE还是正常系统。

网上有人问如何判断是否PE, 看了几个答案都不靠谱,这下无意中找到了一个靠谱办法。
回复

使用道具 举报

39#
发表于 2018-1-20 21:56:29 | 只看该作者
quya 发表于 2018-1-20 21:52
不会吧? 你那儿的日期格式是啥? 会不会和系统的设置有关?

如果只是在一些固定格式间变动,程序复杂 ...

XP中格式貌似是xx/xx/xx,具体记不清了。
回复

使用道具 举报

38#
 楼主| 发表于 2018-1-20 21:52:36 | 只看该作者

不会吧? 你那儿的日期格式是啥? 会不会和系统的设置有关?

如果只是在一些固定格式间变动,程序复杂些也是可以办到的吧? 我只是好奇你那儿的格式是啥?

比如说,xx/xx/xxxx, 不好意思,我以前可能写错了,不是xx-xx-xxxx, 但只要后4位是年就没有问题啊。

点评

XP中格式貌似是xx/xx/xx,具体记不清了。  详情 回复 发表于 2018-1-20 21:56
回复

使用道具 举报

37#
发表于 2018-1-20 20:47:03 | 只看该作者
日期格式!

点评

不会吧? 你那儿的日期格式是啥? 会不会和系统的设置有关? 如果只是在一些固定格式间变动,程序复杂些也是可以办到的吧? 我只是好奇你那儿的格式是啥? 比如说,xx/xx/xxxx, 不好意思,我以前可能写错了,  详情 回复 发表于 2018-1-20 21:52
回复

使用道具 举报

36#
发表于 2018-1-19 22:40:44 | 只看该作者
quya 发表于 2018-1-15 13:10
万分感谢, 应该是可行的。

1. 当硬盘是GPT的时候,PE以legacy方式启动,无法安装windows。 我没有尝 ...

已确定,不是一样的!

不过我想,算了,我不想了。

说不定,你也有N种系统的PE需要适配!

点评

你说的“已确定,不是一样的”指什么? 还望明示,谢谢  发表于 2018-1-20 14:02
回复

使用道具 举报

35#
 楼主| 发表于 2018-1-15 13:10:52 | 只看该作者
本帖最后由 quya 于 2018-1-15 13:39 编辑
nttwqz 发表于 2018-1-13 19:30
我有个思路,虽然看似麻烦点!

安装系统时单独划分100M启动分区(MBR),利用bcdboot c:\windows /s z: /l ...

万分感谢, 应该是可行的。

1. 当硬盘是GPT的时候,PE以legacy方式启动,无法安装windows。 我没有尝试将wim 直接解压至硬盘, 然后用 bcdboot c:\windows /s z: /l zh-CN /f ALL 强行写入来启动, 我的估计是不行的, 如果可行那么太简单了。 网上很多大神就不会想出一些繁琐的方式来以legacy启动GPT的硬盘。

2. 注册表方式可行, 试了2个PE, 均能读出BIOS的发布日期, 这样的话, 也用不着去判断CPU的型号了。判断BIOS的日期比CPU更可靠。

剩下的工作验证是否 BIOS 日期的格式都是 XX-XX-XXXX

点评

已确定,不是! 不过我想,算了,我不想了。 说不定,你也有N种系统的PE需要适配!  详情 回复 发表于 2018-1-19 22:40
回复

使用道具 举报

34#
 楼主| 发表于 2018-1-13 20:50:27 | 只看该作者
本帖最后由 quya 于 2018-1-15 13:34 编辑
nttwqz 发表于 2018-1-13 19:30
我有个思路,虽然看似麻烦点!

安装系统时单独划分100M启动分区(MBR),利用bcdboot c:\windows /s z: /l ...

100M的分区在我的批处理里是划分的。

我也知道 bcdboot c:\windows /s z: /l zh-CN /f ALL 这个命令,只是从未试过在GPT下是否能legacy启动,谢谢你的提醒,我找机会试试看。

如果以上成立,才能进行下一步。

另外,PE里的注册表项 HKLM\HARDWARE\DESCRIPTION\System\BIOS /v "BIOSReleaseDate" 难道会随硬件变? 如果这个成立,那么基本上仅这一条就解决问题了。

下个星期我都会去试一下。

精简了一下你的代码:

  1. for /f "tokens=3" %i in ('reg query HKLM\HARDWARE\DESCRIPTION\System\BIOS /v BIOSReleaseDate') do set BIOSReleaseDate=%i
  2. if %BIOSReleaseDate:~-4,4% gtr 2011 (echo Support UEFI) else echo Only support Legacy
复制代码


回复

使用道具 举报

33#
发表于 2018-1-13 19:30:35 | 只看该作者
我有个思路,虽然看似麻烦点!

安装系统时单独划分100M启动分区(MBR),利用bcdboot c:\windows /s z: /l zh-CN /f ALL来创建启动文件,这样无论是什么模式,都能启动。

离线挂载修改注册表,也可以不用,只要设法开机运行脚本即可(比如SetupComplete.cmd),这样便可以在完整系统下判断是否支持UEFI了,wmic、systeminfo之类等等随便用。

利用判断的结果再次利用修改启动文件打到优先使用UEFI的目的或者其他什么都行!

初步估计,你只需要一个SetupComplete.cmd即可实现。


这样就不用纠结是否WinPE这样不完整的环境的问题了。

点评

万分感谢, 应该是可行的。 1. 当硬盘是GPT的时候,PE以legacy方式启动,无法安装windows。 我没有尝试将wim 直接解压至硬盘, 然后用 bcdboot c:\windows /s z: /l zh-CN /f ALL 强行写入来启动, 我的估计是不  详情 回复 发表于 2018-1-15 13:10
100M的分区在我的批处理里是划分的。 我也知道 bcdboot c:\windows /s z: /l zh-CN /f ALL 这个命令,只是从未试过在GPT下是否能legacy启动,谢谢你的提醒,我找机会试试看。 如果以上成立,才能进行下一步。  详情 回复 发表于 2018-1-13 20:50
回复

使用道具 举报

32#
发表于 2018-1-13 18:51:52 | 只看该作者
既然如此,我也来娱乐一下,仅8.1x64测试过

  1. @echo off
  2. for /f "tokens=3" %%a in ('reg query HKLM\HARDWARE\DESCRIPTION\System\BIOS /v "BIOSReleaseDate" ^| find /i "reg_sz"') do for /f "tokens=3 delims=/-." %%b in ("%%a") do if "%%b" gtr "2011" (echo 支持UEFI!) else echo 不支持UEFI!
  3. pause
复制代码
回复

使用道具 举报

31#
发表于 2018-1-12 23:50:56 | 只看该作者
我知道你的意思了 。
你是要知道主机是否支持UEFI。然后在这个基础上继续后面的操作。
前面你说不能确定PE是何种方式启动的。现在又要判断主机支持与否。
确实太高级了。。

点评

有坛友在三楼就明白我的意思了,如果我的表述造成了你的误解,我很抱歉。所以我一直在一楼添加内容, 虽然显得啰嗦了些, 但希望不再引起大家的误会。  发表于 2018-1-13 09:19
回复

使用道具 举报

30#
发表于 2018-1-12 08:56:24 | 只看该作者
本帖最后由 captain_g 于 2018-1-12 09:02 编辑

微软说的:

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.


https://technet.microsoft.com/zh-cn/library/dn293283.aspx

点评

这个不是问题所在, 我前面的代码早已解决了这个问题。  发表于 2018-1-12 09:03
回复

使用道具 举报

29#
发表于 2018-1-12 08:42:25 | 只看该作者
quya 发表于 2018-1-12 08:16
各位原意帮忙的我十分感谢, 但无法帮忙的请不要说这样做毫无意义等这样的话, 我不想再浪费时间辩解这样做 ...


此问题的确存在不确定性。

我的周边AMD机器,粗略可以概括为970芯片组之后的主板,包括FM1、FM2及更新的版型基本都支持UEFI,从芯片组信息入手?因为从CPU不好确认,例如AMD Athlon64 II 215这样的CPU,就可以插在770---970众多型号的AM2---AM3+主板上。

点评

从CPU确认比较简单, 因为不必太精确, 也就是说吃不准的一律保守使用legacy, 基本不会漏过太多。从bios判断使用syteminfo当然精确些, 但通用性差了许多。  发表于 2018-1-12 08:57
回复

使用道具 举报

28#
 楼主| 发表于 2018-1-12 08:16:03 | 只看该作者
本帖最后由 quya 于 2018-1-12 08:51 编辑

各位原意帮忙的我十分感谢, 但无法帮忙的请不要说这样做毫无意义等这样的话, 我不想再浪费时间辩解这样做是否有意义, 我只是需要方法。 退一万步说, 我要这样的代码纯粹只是自娱自乐, 行吗?

一个需要技巧和资料方面的批处理, 却变成了讨论其他问题, 难道大家都乐意回答一些初级问题?我就不信无忧启动论坛会差到这种地步。


如果PE支持Systeminfo命令, 我自然不必大费周章(见下列代码,可以得出bios生产日期,假如值大于2011年,那么基本支持UEFI), 这就是为什么我寻找更通用代码的原因, 也算是一个挑战吧。

  1. for /f "tokens=1,2 delims=:" %i in ('systeminfo') do if "%i"=="BIOS 版本" set "biosver"="%j" &echo %biosver:~-11,4%
复制代码


点评

此问题的确存在不确定性。 我的周边AMD机器,粗略可以概括为970芯片组之后的主板,包括FM1、FM2及更新的版型基本都支持UEFI,从芯片组信息入手?但从CPU不好确认,例如AMD Athlon64 II 215这样的CPU,就可以插在7  详情 回复 发表于 2018-1-12 08:42
回复

使用道具 举报

27#
 楼主| 发表于 2018-1-12 08:10:00 | 只看该作者
icevan 发表于 2018-1-11 22:13
当然通过winload.efi判断不行,双启的PE
都会有这两个文件。


另外,通过winload.efi 判断当然行, 又不是判断目录是否存在这个文件, 而是判断BCD启动菜单里是否存在这个条目。

我使用的环境是, MBR启动的PE  BCD菜单里当然没有winload.efi, 退一步讲, 即使有,我换一个PE不行吗?
回复

使用道具 举报

26#
 楼主| 发表于 2018-1-12 08:03:30 | 只看该作者
本帖最后由 quya 于 2018-1-12 09:02 编辑
icevan 发表于 2018-1-11 22:13
难道主机默认使用的传统模式优先,但又支持
UEFI,你还要让使用者修改BIOS???


虽然默认是传统模式启动, 当然也可以UEFI启动, 可以用UEFI为什么不呢?

注意BIOS默认设置有的是legacy优先, 有的是UEFI优先。

还有的默认BOTH, 但不会默认 legacy only 或者 UEFI only. 除非你把出厂的默认设置强行手动改过。如果使用者有这个本事去改这个设置,我自然不必担心他的操作, 甚至批处理都可以省略了。


所以需要程序判断。难道BIOS设置legacy优先 在不改BIOS的前提下, 就不能用UEFI了?
回复

使用道具 举报

25#
发表于 2018-1-12 06:36:54 来自手机 | 只看该作者
除非你的pe做成智能的,设定优先efi启动,efi启动不了才legacy启动,这样就能百分之百判断了。不管何种启动pe都可以做另一种启动方式的系统,所以凭pe判断就不是个事。

点评

另外,你的很多意见确实非常给人启发, 但我没那个本事去实现你的想法。 你和三楼的朋友都是一开始就了解我的意思, 说了很多建设性的想法,我也能从中学到不少,谢谢。  发表于 2018-1-13 09:37
这个有点脑洞大开,有点意思。不过窃以为这样智能的PE很难做出来吧, 至少目前我没看见过。这样的处理方式无疑让难度呈指数级上升。  发表于 2018-1-13 09:24
回复

使用道具 举报

24#
发表于 2018-1-11 22:13:43 | 只看该作者
quya 发表于 2018-1-11 18:26
不是误区。

根据PE判断自然可以,但实际上在传统方式启动下PE, 并不表示不支持UEFI启动, 只是某些 ...

所以说你进入误区了。。
传统模式和UEFI启动所用到的BCD内容是不一样的。
这样就可以判断了。当然通过winload.efi判断不行,双启的PE
都会有这两个文件。
现在回到你的问题,既然是傻瓜式的,那使用者就不会管是 那种方式启动的,
使用的是主机默认的启动模式,默认是UEFI优先启动就进入的是UEFI的PE。
你非要纠结主板支不支持UEFI,难道主机默认使用的传统模式优先,但又支持
UEFI,你还要让使用者修改BIOS???

点评

另外,通过winload.efi 判断当然行, 又不是判断目录是否存在这个文件, 而是判断BCD启动菜单里是否存在这个条目。 我使用的环境是, MBR启动的PE BCD菜单里当然没有winload.efi, 退一步讲, 即使有,我换一个P  详情 回复 发表于 2018-1-12 08:10
虽然默认是传统模式启动, 当然也可以UEFI启动, 可以用UEFI为什么不呢? 注意BIOS默认设置有的是legacy优先, 有的是UEFI优先。 还有的默认BOTH, 但不会默认 legacy only 或者 UEFI only. 所以需要程序  详情 回复 发表于 2018-1-12 08:03
回复

使用道具 举报

23#
发表于 2018-1-11 18:48:15 | 只看该作者
quya 发表于 2018-1-11 18:26
不是误区。

根据PE判断自然可以,但实际上在传统方式启动下PE, 并不表示不支持UEFI启动, 只是某些主 ...

是不是剑走偏锋了?没必要吧?


在USBOS v3.0下,是能够在启动流程中,即时、明确告诉操作者当前pe启动的模式:uefi or bios;即便没留意此信息,在使用winntsetup或dism++或Windows原配的setup.EXE部署系统时,都会自动或手动配置启动模式啊。需要干预吗?

点评

我不是setup部署的, 是类似ghost的办法, 我用的Snapshot  发表于 2018-1-11 18:54
回复

使用道具 举报

22#
 楼主| 发表于 2018-1-11 18:26:01 | 只看该作者
本帖最后由 quya 于 2018-1-11 18:59 编辑
icevan 发表于 2018-1-10 21:52
你有个误区。
我相信你的自动分区不会是dos环境下运行。
如果在PE里运行,根据你pe是UEFI启动还是BIOS启 ...


不是误区。

根据PE判断自然可以,但实际上在传统方式启动下PE, 并不表示不支持UEFI启动, 只是某些主板默认legacy优先,而现在多数PE支持多种方式启动。

默认的情况下,你可能不确定PE将以何种方式启动, 如果你在现场, 自然没有问题, 哪怕完全手动。

但当你做好了傻瓜式的启动,在企业部署系统时, 并且告诉人家当启动完毕只要点一个“图标”的时候, 得到的结果可能不是你希望的。

GPT和MBR理论上没有必然联系,但真要将GPT的硬盘来做启动盘,恐怕也要做些处理才行。至少我是在这个方面失败过, 而且以后再也没这样做过, 因为没必要。

这就是我的思路为什么在环境变量上的CPU型号上考虑, 根据型号来判定年份, 再辅以PE的环境来判断,那么准确率应该在90%以上。 纯靠PE的启动方式判断, 估计准确率在70%左右。

所以步骤是,如果PE现在是以UEFI启动的, 那么100%可以启动。 余下的如果PE以legacy启动, 那么看CPU型号, 又可以多几成概率, 再吃不准的一律以legacy处理。

CPU按intel和amd型号分, intel的大致了解了, AMD 未知, 会造成误判。

  1. set isUEFI=False
  2. bcdedit /enum {current} |find "winload.efi">nul 2>&1 &&set isUEFI=True
  3. if %PROCESSOR_REVISION:~0,1% gtr 2 set isUEFI=True
复制代码


以上代码对intel CPU来说, 应该有90%的准确率, 当%PROCESSOR_REVISION:~0,1% ==2 的时候, 有部分支持UEFI,这部分只好放弃判断。

有谁有AMD的资料?

点评

所以说你进入误区了。。 传统模式和UEFI启动所用到的BCD内容是不一样的。 这样就可以判断了。当然通过winload.efi判断不行,双启的PE 都会有这两个文件。 现在回到你的问题,既然是傻瓜式的,那使用者就不会管是  详情 回复 发表于 2018-1-11 22:13
是不是剑走偏锋了?没必要吧? 在USBOS v3.0下,是能够在启动流程中,即时、明确告诉操作者当前pe启动的模式:uefi or bios;即便没留意此信息,在使用winntsetup或dism++或Windows原配的setup.EXE部署系统时,  详情 回复 发表于 2018-1-11 18:48
回复

使用道具 举报

21#
发表于 2018-1-11 16:09:00 | 只看该作者
bcdedit /enum {current}|find "system32\winload.exe">nul
if errorlevel 1 echo 当前模式为efi&&goto efi
if errorlevel 0 echo 当前模式为bios&&goto bios
我是这样简单“判断”的
回复

使用道具 举报

20#
发表于 2018-1-10 21:52:31 | 只看该作者
你有个误区。
我相信你的自动分区不会是dos环境下运行。
如果在PE里运行,根据你pe是UEFI启动还是BIOS启动就可以判断了。

点评

不是误区。 根据PE判断自然可以,但实际上在传统方式启动下PE, 并不表示不支持UEFI启动, 只是某些主板默认legacy优先,而现在多数PE支持多种方式启动。 默认的情况下,你可能不确定PE将以何种方式启动, 如  详情 回复 发表于 2018-1-11 18:26
回复

使用道具 举报

19#
发表于 2018-1-10 21:45:13 | 只看该作者
GPT和MBR和UEFI有必然 的联系 吗?不支持UEFI的就不能用GPT了?
回复

使用道具 举报

18#
发表于 2017-12-30 02:33:21 | 只看该作者
好文学习了.
回复

使用道具 举报

17#
发表于 2017-12-24 10:37:54 来自手机 | 只看该作者
尼采1729 发表于 2017-12-22 21:20
一般的bios都会有的 实在不知道页可以找售后帮你查一查

就服你
回复

使用道具 举报

16#
发表于 2017-12-24 10:08:37 | 只看该作者
最好就是利用GPT兼容MBR方案,0扇区写入gpt  4个分区信息(不过现在好像没分区工具支持,可能要写一个工具)和mbr引导,不支持GPT的bios也可以启动,至于系统启动后,应该和系统支不支持GPT有关了。
回复

使用道具 举报

15#
发表于 2017-12-24 04:28:20 | 只看该作者
nttwqz 发表于 2017-12-23 08:00
谁知道楼主要要干嘛,如果是装系统,在接触机器,用U盘启动的时候基本都能分辨是否支持了,哪里用得着批 ...

既然人家都不懂,你给它弄个批处理,他还是不懂得怎么装系统。{:1_201:}
回复

使用道具 举报

14#
发表于 2017-12-23 08:00:01 来自手机 | 只看该作者
zengqcyxx 发表于 2017-12-23 01:04
要这么麻烦吗?弄一个支持EFI启动的WIN8X64PE放U盘,如果是台式机支持UEFI的话,你按F12,就有UEFI的启动信 ...

谁知道楼主要要干嘛,如果是装系统,在接触机器,用U盘启动的时候基本都能分辨是否支持了,哪里用得着批处理来判断什么费劲。

点评

既然人家都不懂,你给它弄个批处理,他还是不懂得怎么装系统。  详情 回复 发表于 2017-12-24 04:28
批处理有几个作用: 1. 给不懂的人用 2.减少错误和重复劳动。 不懂的人连BIOS也不知道, 如何去判断?  发表于 2017-12-23 10:48
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-27 14:35

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表