无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: liuzhaoyzz
打印 上一主题 下一主题

请问下有没有办法用批处理或者命令行小程序确定系统引导分区?

    [复制链接]
91#
 楼主| 发表于 2021-1-12 08:32:04 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-12 11:10 编辑
dos时代菜鸟 发表于 2021-1-12 08:28
互相学习 有提高。
不完善,还需要研究研究。

大神太谦虚了,我觉得你的名字可以改名了,叫做dos时代高手才对!
回复

使用道具 举报

92#
 楼主| 发表于 2021-1-12 11:10:36 | 显示全部楼层
dos时代菜鸟 发表于 2021-1-12 10:45
fsutil fsinfo drives 找出所有盘符,然后在用 diskpart 做,不管 bcd_vol 有没有被挂载盘符,只要 diskp ...

fsutil fsinfo这样子的命令,在windows下面还行,如果用于pe,有的pe里面这样子的命令不支持,比如bootmgr/bootmgfw.efi→WIN10PE.WIM这种,依赖于微软的组件或者命令,总感觉不是那么完美。

点评

如果在 pe 下,diskpart 恐怕也不能 十分把我的 找出 bcd 引导分区。因为有的是 虚拟盘 做的引导,有的是tftp,启动模式太多了, 估计这也是 为啥 diskpart 把 win 所在分区 定义为 boot/启动 ,他可能找的是用  详情 回复 发表于 2021-1-12 11:14
回复

使用道具 举报

93#
 楼主| 发表于 2021-1-12 11:52:16 | 显示全部楼层
dos时代菜鸟 发表于 2021-1-12 11:14
如果在 pe 下,diskpart 恐怕也不能 十分把握的 找出 bcd 引导分区。因为有的是 虚拟盘 做的引导,有的是 ...

        是的,主要的使用环境和条件,大部分都是基于正常的windows环境。偶尔某些条件下,bootmgr/bootmgfw.efi→pe.wim这样子的情况,选择引导分区不会出错,也有意义,不过场景比较少。

点评

这个 脚本没有用到 fsutil 用的一个比较古老的办法,推算出未占用的盘符,但不知适用范围如何。 fsutil 的 部分也包含在内,只是没有调用。  详情 回复 发表于 2021-1-12 12:38
回复

使用道具 举报

94#
 楼主| 发表于 2021-1-12 13:26:56 | 显示全部楼层
dos时代菜鸟 发表于 2021-1-12 12:38
这个 脚本没有用到 fsutil 用的一个比较古老的办法,推算出未占用的盘符,但不知适用范围如何。
fsu ...

        感谢大神,已收藏!

点评

pe 下恐怕 不适用 ,因为 diskpart 局限性和 pe 启动环境的复杂性。  详情 回复 发表于 2021-1-12 13:30
回复

使用道具 举报

95#
 楼主| 发表于 2021-1-12 13:35:33 | 显示全部楼层
dos时代菜鸟 发表于 2021-1-12 13:30
pe 下恐怕 不适用 ,因为 diskpart 局限性和 pe 启动环境的复杂性。

理解,我主要是用于正常的windows环境。谢谢了!
回复

使用道具 举报

96#
 楼主| 发表于 2021-1-12 14:38:01 | 显示全部楼层
窄口牛 发表于 2021-1-12 13:45
别考虑pe,pe是怎么启动的和硬盘上一毛钱关系也没有。

        说话别这么绝对,bootmgr/bootmgfw.efi→BCD→PE.WIM,这种情况,启动盘就是可以绝对确定的,怎么会没有关系?基本上只要是微软的bootmgr/bootmgfw.efi引导作为第一引导,不加入其他引导器中转,启动windows或者PE.WIM,启动分区都是可以确定的。
回复

使用道具 举报

97#
 楼主| 发表于 2021-1-12 14:56:16 | 显示全部楼层
窄口牛 发表于 2021-1-12 14:44
判断到pe咋启动的有啥意义?
你说的是硬盘上安装的pe?大部分人都是从优盘起来的pe,所以没多大意义。

不是判断PE怎么启动的,是确定引导分区。确定引导分区之后,我可以直接在PE下拷贝文件到引导分区什么的,不然的话,重启进入windows,确定启动分区,再拷贝文件?我说的是靠程序自动化识别,不是靠人眼看来确定这个启动分区。
PE我基本上都是从硬盘启动,优盘移动硬盘只是我的备胎方案,对我来说有意义。
不同的人具有不同的使用场景。不能说你体会不到这个场景,你就觉得这样做没意义,这太狭隘了。
回复

使用道具 举报

98#
 楼主| 发表于 2021-1-12 16:27:58 | 显示全部楼层
窄口牛 发表于 2021-1-12 15:09
那哪判断的了,太难了吧,看看高手咋解决。

       168楼,CodeHz大神已经实现了啊,http://bbs.wuyou.net/forum.php?m ... &fromuid=298214
回复

使用道具 举报

99#
 楼主| 发表于 2021-1-13 07:38:57 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-13 07:44 编辑
dos时代菜鸟 发表于 2021-1-12 12:38
这个 脚本没有用到 fsutil 用的一个比较古老的办法,推算出未占用的盘符,但不知适用范围如何。
fsu ...

用这个版本,我在英文版win7下面测试,结果不对。
英文版win7,为了正常显示中文目录,国家我选择了中国,简体。


CodeHz大神的smartmountfirmware结果是对的。

点评

新改进了一下,应该能 解决这个问题。  详情 回复 发表于 2021-1-14 11:57
回复

使用道具 举报

100#
 楼主| 发表于 2021-1-13 07:41:12 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-13 07:44 编辑
527104427 发表于 2021-1-12 21:26
大家还这么热情高涨吗?我也来凑个热闹。
这两天请M大写了一段代码,用PECMD调取系统API来判断启动分区。
...

5大这个版本结果还是不对。
UEFI下从ESP分区启动XXX.VHD结果是对的。
UEFI下从FAT32分区启动XXX.VHD结果不对。

CodeHz大神的smartmountfirmware结果是对的。
回复

使用道具 举报

101#
 楼主| 发表于 2021-1-13 07:43:34 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-13 08:03 编辑
nttwqz 发表于 2021-1-7 21:21
重写,不再基于dpinfo,UAC开启时需要重启explorer.exe资源管理器中才会显示,管理员命令行操作请忽略。

用这个版本,UEFI下从FAT32分区启动xxx.vhd,vhd里面是英文版的win7,为了显示中文目录,国家选择了中文,结果不对指向了ESP分区,应该是FAT32分区。

CodeHz大神的smartmountfirmware结果是对的。
回复

使用道具 举报

102#
 楼主| 发表于 2021-1-13 08:02:05 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-13 08:03 编辑

对于从FAT32分区的bootmgfw.efi直接启动pe.wim的场景:
1、nttwqz的checkbootpart_v4判断错误,指向了ESP分区。
2、dos时代菜鸟判断错误,指向了ESP分区。
3、5大的ChkMbrPbr2021-01-13判断错误,指向了ESP分区。
4、CodeHz的smartmountfirmware判断正确,准确地指向了
FAT32分区

大家可以在虚拟机里面挂几个虚拟硬盘,虚拟硬盘格式MBR、GPT挂两个,操作系统安装在vhd或者直接安装在虚拟硬盘中,应该就能够重现情况了。        

点评

已经有高手编程实现了,为何还要用脚本?  详情 回复 发表于 2021-1-13 09:42
回复

使用道具 举报

103#
 楼主| 发表于 2021-1-13 08:16:44 | 显示全部楼层
dos时代菜鸟 发表于 2021-1-12 23:16
刚研究了一下 vbs 调用 wmi 实现这个功能,发现了个惊喜,
瞬间 找到并挂载 bcd 启动卷。

你的这段代码,我运行好像出错了。

QQ截图20210113081611.jpg (22.19 KB, 下载次数: 93)

QQ截图20210113081611.jpg

点评

[attachimg]472796[/attachimg] 我这边正常呀,正常win10 系统,  详情 回复 发表于 2021-1-13 11:18
回复

使用道具 举报

104#
 楼主| 发表于 2021-1-13 09:44:16 | 显示全部楼层
nttwqz 发表于 2021-1-13 09:42
已经有高手编程实现了,为何还要用脚本?

哦,我只是反馈下结果,如果能改进最好了。一个需求,有多个解决方案挺好啊。

点评

这么看来一个男人/女人难以满足你啊  详情 回复 发表于 2021-1-13 10:17
我怀疑是NtQuerySystemInformation函数结果不对。因为默认使用的是这个,失败才解析符号链接。 等下有空把这段注释掉,直接解析符号链接,估计就没问题了。  详情 回复 发表于 2021-1-13 09:54
回复

使用道具 举报

105#
 楼主| 发表于 2021-1-13 10:28:03 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-13 10:39 编辑
nttwqz 发表于 2021-1-13 10:17
这么看来一个男人/女人难以满足你啊

我发起的问题,引来众多高手跟帖,辛苦地写代码,你说说看,如果都不测试、反馈下,这种忽视别人劳动成果的行为,是否是对于辛苦写代码的高手们不尊重?
论坛里面,我怕的就是那种失败了不反馈、成功了不报告,转身就跑路的网友。


点评

麻烦最后测试一下,不行就彻底放弃了。  详情 回复 发表于 2021-1-13 12:08
回复

使用道具 举报

106#
 楼主| 发表于 2021-1-13 13:42:12 | 显示全部楼层
527104427 发表于 2021-1-13 12:08
麻烦最后测试一下,不行就彻底放弃了。

        这个版本,在另一台电脑上面测试,UEFI下从FAT32分区启动是正常的,但这台电脑没有ESP分区,晚上我回去后再测试下看看。

另外,ChkMbrPbr -DelBootDrv太强制化卸载启动分区了,执行这个命令之后,不管原来启动分区有没有盘符,都直接强制卸载了盘符。应该先检测下原来系统里面有没有给启动分区分配盘符,如果原来有就不要卸载,如果没有才卸载,不然的话可能会导致一定的问题。

点评

好像没办法判断哦,因为程序分配跟系统自动分配没区别啊,应该除了系统盘之外,卸载其他盘符不会有啥影响吧?  详情 回复 发表于 2021-1-13 14:04
回复

使用道具 举报

107#
 楼主| 发表于 2021-1-13 13:43:36 | 显示全部楼层
dos时代菜鸟 发表于 2021-1-13 11:18
我这边正常呀,正常win10 系统,
估计是你那里 的系统wmi 没有 Win32_Volume,

搞不清楚是怎么回事。也是WIN10。

点评

管理员权限下运行,那个自动生成的 VBS 如果不能运行,说明WMI 不通用。  详情 回复 发表于 2021-1-13 13:56
回复

使用道具 举报

108#
 楼主| 发表于 2021-1-13 13:57:52 | 显示全部楼层
dos时代菜鸟 发表于 2021-1-13 13:56
管理员权限下运行,那个自动生成的 VBS 如果不能运行,说明WMI 不通用。

我试了,右击以管理员身份运行也是一样的结果。
回复

使用道具 举报

109#
 楼主| 发表于 2021-1-13 14:08:46 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-13 14:17 编辑
527104427 发表于 2021-1-13 14:04
好像没办法判断哦,因为程序分配跟系统自动分配没区别啊,应该除了系统盘之外,卸载其他盘符不会有啥影响 ...

可能会有影响的。比如说这个引导盘符恰巧是当前系统的我的文档所转移到的盘符,强制卸载这个盘符之后,许多功能就不正常了。(这个场景解释起来比较费劲,但是真的存在,实机测试的)

卸载引导盘符最好能够恢复用户原来的原状,恢复现场。原来有盘符的不要卸载;原来没有盘符的才卸载,这样子比较智能化。


点评

我就是这么写的  详情 回复 发表于 2021-1-13 14:24
有变通的方法: ChkMbrPbr -ChkBootDrv- 先检测原先有没有盘符,如果没盘符,干完活再 ChkMbrPbr -DelBootDrv 注意,-ChkBootDrv- 只检测,不分配盘符。  详情 回复 发表于 2021-1-13 14:21
(思考了一下,我那个smartmountfirmware好像也会尝试卸载原有的,只不过恰好卸载不掉其他方式挂载的而已(巧合)  详情 回复 发表于 2021-1-13 14:18
回复

使用道具 举报

110#
 楼主| 发表于 2021-1-13 14:19:43 | 显示全部楼层
CodeHz 发表于 2021-1-13 14:18
(思考了一下,我那个smartmountfirmware好像也会尝试卸载原有的,只不过恰好卸载不掉其他方式挂载的而已 ...

smartmountfirmware好像做了处理的,原来有的没有卸载,原来没有的就卸载,恢复原状。哪怕是卸载不掉的巧合,也是很好的。
回复

使用道具 举报

111#
 楼主| 发表于 2021-1-13 14:26:27 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-13 14:35 编辑
527104427 发表于 2021-1-13 14:21
有变通的方法:
ChkMbrPbr -ChkBootDrv-
先检测原先有没有盘符,如果没盘符,干完活再

set "ChkMbrPbr=%~sdp0ChkMbrPbr_x86.exe"
%ChkMbrPbr% -ChkBootDrv- 1>nul 2>nul || (
%ChkMbrPbr% -DelBootDrv
echo 已卸载启动分区%bootdisk2%:
)
哦,试了下,果然是可以!

点评

-ChkBootDrv- 后面有个减号,不分配盘符-ChkBootDrv 后面没有减号,自动分配盘符  详情 回复 发表于 2021-1-13 14:31
回复

使用道具 举报

112#
 楼主| 发表于 2021-1-13 14:32:07 | 显示全部楼层
CodeHz 发表于 2021-1-13 14:28
说到不小心卸载正在用的盘,我之前还遇到过,直接把d盘挂没了,还好mountvol还在,恢复回来了(
幸好没把c ...

不用mountvol也行啊,开始里面有磁盘管理,调出来给他分配个盘符即可。或者祭出bootice给他分配个盘符也行。我试了5大的程序没法卸载那种C盘的,就是引导文件和windows目录在一起的那种C盘,好像是卸载不掉的,这种卸载掉了,肯定会出岔子,这是对的。

点评

你看下代码就知道了,卸载是排除了系统盘的。 为什么呢,因为我调试的时候就把系统盘干掉了,强制关机,听见硬盘磁头刮了一下盘片,吓死了  详情 回复 发表于 2021-1-13 14:54
回复

使用道具 举报

113#
 楼主| 发表于 2021-1-13 15:09:36 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-13 15:11 编辑
CodeHz 发表于 2021-1-13 14:28
说到不小心卸载正在用的盘,我之前还遇到过,直接把d盘挂没了,还好mountvol还在,恢复回来了(
幸好没把c ...

大神,你那边没有vc编译环境吗?你给的源代码能否用vc编译?我感觉vc编译的程序,360应该能过吧。大学时候学习谭浩强的《c语言程序设计》,早已还给老师了,我现在沦落到只能写“Hello world!”的程序了。

smartmountfirmware不完美的一点,就是不能过360杀软,虽然大家都知道这个没有病毒,但是向别人解释没有病毒要比写代码更让人心累。。。

点评

(vc当然有,但是版本都是2019的了,xp兼容模式早就没了( 这个改成vc兼容的倒也不难把那几个宏改成空的实现应该就好了(#include 改成 #define scoped(x))后果就是泄露几个句柄,但是一次性运行的程序泄露没有关  详情 回复 发表于 2021-1-13 15:19
回复

使用道具 举报

114#
 楼主| 发表于 2021-1-13 15:10:27 | 显示全部楼层
527104427 发表于 2021-1-13 14:54
你看下代码就知道了,卸载是排除了系统盘的。
为什么呢,因为我调试的时候就把系统盘干掉了,强制关机, ...

还好没把5大的硬盘搞坏,不然我的罪过就大了,你的硬盘里面一定有不少宝贝!记得多备份啊!云端,移动硬盘啥的多备份几份!
回复

使用道具 举报

115#
 楼主| 发表于 2021-1-13 16:02:49 | 显示全部楼层
nttwqz 发表于 2021-1-13 15:25
有一次我都吧C盘给卸载了,任务管理器cmd各种打不开只能重启了

原来调试代码的时候,你也干过这样子的事情~~~

点评

不是,很久之前突发奇想看能不能将C盘卸载了,一试果然能。  详情 回复 发表于 2021-1-13 17:34
回复

使用道具 举报

116#
 楼主| 发表于 2021-1-13 18:00:30 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-13 18:09 编辑
527104427 发表于 2021-1-13 12:08
麻烦最后测试一下,不行就彻底放弃了。

5大,好消息来了!
用这个版本的ChkMbrPbr测试结果都对了!bootmgr/bootmgfw.efi→PE.WIM结果也正确了!中文版、英文版操作系统都没问题。结果与CodeHz大神的smartmountfirmware有异曲同工之妙。ChkMbrPbr_x86.exe也是很容易被360咔嚓掉,是发给别人就被咔嚓掉了,不是运行过程中360提示放行这样子,这个有点郁闷。



奉上我写的与之搭配的拙劣的批处理:
@echo off
set "ChkMbrPbr=%~sdp0ChkMbrPbr_x86.exe"
for /f "tokens=1 delims=: " %%i in ('%ChkMbrPbr% -ChkBootDrv-') do set "bootdisk3=%%i"
for /f "tokens=1 delims=: " %%i in ('%ChkMbrPbr% -ChkBootDrv') do set "bootdisk2=%%i"
echo 启动分区=%bootdisk2%
if not defined bootdisk2 (
rem 如果ChkMbrPbr被360干掉
rem echo 从Z→C盘开始寻找BOOTMGR
for %%i in (Z Y X W V U T S R Q P O N M L K J I H G F E D C ) do (
dir /a %%i:\BOOTMGR 1>nul 2>nul && (
set bootdisk2=%%i
goto :next7
))
)
:next7
echo 启动分区=%bootdisk2%:
pause
if /i "%bootdisk3%"=="" (
%ChkMbrPbr% -DelBootDrv
echo 已卸载启动分区%bootdisk2%:
)
pause


感谢5大出手!


ChkMbrPbr2021-01-13-2.rar

1.73 MB, 下载次数: 25, 下载积分: 无忧币 -2

点评

发现之前有几处输出弄错了,搞成错误输出了,导致批处理捕捉不到任何东西,再改一下吧: 报毒的问题我是无能为力的,对于PECMD来说,这是一道过不去的坎。  详情 回复 发表于 2021-1-13 18:27
回复

使用道具 举报

117#
 楼主| 发表于 2021-1-13 19:50:12 | 显示全部楼层
527104427 发表于 2021-1-13 18:27
发现之前有几处输出弄错了,搞成错误输出了,导致批处理捕捉不到任何东西,再改一下吧:

感谢5大分享!
回复

使用道具 举报

118#
 楼主| 发表于 2021-1-14 07:38:20 | 显示全部楼层
dos时代菜鸟 发表于 2021-1-13 20:59
这个 全 依赖 Diskpart+注册表 ,按理说 diskpart 的硬盘和分区序列应该 和 注册表中 记载的是一致的。
...

这个版本的结果还是不对,电脑里面有两个MBR硬盘,一个GPT硬盘,从MBR硬盘激活的FAT32分区启动,结果定位到了GPT硬盘的ESP分区了。
回复

使用道具 举报

119#
 楼主| 发表于 2021-1-14 07:40:24 | 显示全部楼层
dos时代菜鸟 发表于 2021-1-13 20:59
这个 全 依赖 Diskpart+注册表 ,按理说 diskpart 的硬盘和分区序列应该 和 注册表中 记载的是一致的。
...

这个版本的结果还是不对,电脑里面有两个MBR硬盘,一个GPT硬盘,从MBR硬盘激活的FAT32分区启动,结果定位到了GPT硬盘的ESP分区了。

QQ拼音截图20210114073515.png (8.31 KB, 下载次数: 121)

QQ拼音截图20210114073515.png

QQ拼音截图20210114074013.png (94.92 KB, 下载次数: 114)

QQ拼音截图20210114074013.png

点评

这个 是 根据注册表 信息来的, 看这个 reg query HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control /v FirmwareBootDevice 难道不准确? 还是 diskpart 与这个 不一致? 看来 真要用 api 了,注册表 靠不  详情 回复 发表于 2021-1-14 08:20
回复

使用道具 举报

120#
 楼主| 发表于 2021-1-14 07:41:53 | 显示全部楼层
CodeHz 发表于 2021-1-14 00:06
你是不是跑在不同的特权级别,看你标题一个管理员一个不是
这玩意挺复杂的,有全局的挂载,和会话的挂载 ...

看了这个技术原理分析,真的是大吃一惊,后台做了那么多尝试和技术分析,真复杂!
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-9-21 09:05

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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