无忧启动论坛

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

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

    [复制链接]
211#
发表于 2021-1-12 08:28:41 | 只看该作者
liuzhaoyzz 发表于 2021-1-11 22:31
我测试了下UEFI下从ESP分区启动WIN10.VHD是正确的,/d参数卸载没问题。
UEFI下从FAT32分区启动WIN7.VHD ...

互相学习 有提高。
不完善,还需要研究研究。

点评

大神太谦虚了,我觉得你的名字可以改名了,叫做dos时代高手才对!  详情 回复 发表于 2021-1-12 08:32
回复

使用道具 举报

212#
 楼主| 发表于 2021-1-12 08:32:04 | 只看该作者
本帖最后由 liuzhaoyzz 于 2021-1-12 11:10 编辑
dos时代菜鸟 发表于 2021-1-12 08:28
互相学习 有提高。
不完善,还需要研究研究。

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

使用道具 举报

213#
发表于 2021-1-12 08:54:43 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-1-12 09:19 编辑
liuzhaoyzz 发表于 2021-1-11 22:31
我测试了下UEFI下从ESP分区启动WIN10.VHD是正确的,/d参数卸载没问题。
UEFI下从FAT32分区启动WIN7.VHD ...

如果卷的数量 超过9 个,可能会出问题,需要研究下。
修改了一下

dpx_3.2.cmd.7z (900 Bytes, 下载次数: 15)






至于 判断 盘符是否由其他途径 分配的问题,还在考虑是否用 pccmd 来做分析判断,而且涉及到 卸载,因为diskpart 的盘符分配是 基于 分区和卷的,而其他的方式有的可以是映射过去的,比如 subst 和 pecmd ,所以这个是比较不好办的。暂时 用 diskpart 完成 应该能够满足需要,但是如果 考虑其他 方式 挂载的 bcd_vol ,可能也只能是 “谁的梦 谁自己圆了”,
通过 diskpart 分析出 对应的是 哪个硬盘的哪个分区,然后到注册表中找其对应的盘符,也是个方法,至于,盘符是咋挂啥的,能不能通过 diskpart 卸载,就需要进一步研究了。




回复

使用道具 举报

214#
发表于 2021-1-12 09:32:25 来自手机 | 只看该作者
盘符已分配可以注册表获取。

点评

不知道pecmd 和 subst 映射的盘符,注册表能否体现出来 还是 有其他的 注册表位置 体现。  详情 回复 发表于 2021-1-12 10:15
不行,注册表里的只有持久分配的才有((subst的没有  详情 回复 发表于 2021-1-12 10:14
回复

使用道具 举报

215#
发表于 2021-1-12 10:14:16 来自手机 | 只看该作者
窄口牛 发表于 2021-1-12 09:32
盘符已分配可以注册表获取。

不行,注册表里的只有持久分配的才有((subst的没有
回复

使用道具 举报

216#
发表于 2021-1-12 10:15:33 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-1-12 10:41 编辑
窄口牛 发表于 2021-1-12 09:32
盘符已分配可以注册表获取。

不知道pecmd 和 subst 映射的盘符,注册表能否体现出来
还是 有其他的 注册表位置 体现。

对于这种 diskpart 只能识别 diskpart 方式挂载的盘符 的问题,
其实还是 谁的梦谁自己圆 吧,毕竟谁挂载的,谁知道咋卸载,也最知道为啥挂载,其他的方式贸然卸载之,还可能造成干扰。

dpx_3.3.cmd.7z (1015 Bytes, 下载次数: 11) 改进了一下

这个脚本 能够 计算出 具体 是哪个硬盘的哪个分区,至于 其他的,就交由具体需要的,再另行 操作吧。

还有一个问题,就是 网络映射盘之类的,盘符diskpart 也探测不到。mountvol 好像也 探测不到 网络共享映射的盘,所以可能要用到 fsutil fsinfo drives


点评

这就是为啥我用的方法是递归的解析每个盘符的实际指向目标,并分成3种情况,返回找不到的就是没这个盘,解析到引导分区的就是引导盘,解析到别的盘的就是别的情况(  详情 回复 发表于 2021-1-12 10:37
回复

使用道具 举报

217#
发表于 2021-1-12 10:37:12 来自手机 | 只看该作者
dos时代菜鸟 发表于 2021-1-12 10:15
不知道pecmd 和 subst 映射的盘符,注册表能否体现出来
还是 有其他的 注册表位置 体现。


这就是为啥我用的方法是递归的解析每个盘符的实际指向目标,并分成3种情况,返回找不到的就是没这个盘,解析到引导分区的就是引导盘,解析到别的盘的就是别的情况(

点评

fsutil fsinfo drives 找出所有盘符,然后在用 diskpart 做,不管 bcd_vol 有没有被挂载盘符,只要 diskpart 没有认出来,就给啊分一个 没有被占用的盘符,然后,用完了,在卸载之, diskpart 之对 自己的行为负责,  详情 回复 发表于 2021-1-12 10:45
回复

使用道具 举报

218#
发表于 2021-1-12 10:45:13 | 只看该作者
CodeHz 发表于 2021-1-12 10:37
这就是为啥我用的方法是递归的解析每个盘符的实际指向目标,并分成3种情况,返回找不到的就是没这个盘, ...

fsutil fsinfo drives 找出所有盘符,然后在用 diskpart 做,不管 bcd_vol 有没有被挂载盘符,只要 diskpart 没有认出来,就给啊分一个 没有被占用的盘符,然后,用完了,在卸载之, diskpart 之对 自己的行为负责,其他的不管,这样不就可以了么?

点评

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

使用道具 举报

219#
发表于 2021-1-12 10:55:57 来自手机 | 只看该作者
(不幸的是,fsutils的行为在不同系统有所区别,导致提取已分配盘符变得困难(https://ss64.org/viewtopic.php?id=327

点评

无非是 回车符 的站位问题,这个 我好像在 论坛里面 见过,我也解决了,忘了咋解决得了。还得研究下  详情 回复 发表于 2021-1-12 11:06
回复

使用道具 举报

220#
发表于 2021-1-12 11:06:42 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-1-12 11:09 编辑
CodeHz 发表于 2021-1-12 10:55
(不幸的是,fsutils的行为在不同系统有所区别,导致提取已分配盘符变得困难(https://ss64.org/viewtopic.p ...

无非是 回车符 的站位问题,这个 我好像在 论坛里面 见过,我也解决了,忘了咋解决得了。还得研究下,
大概是用两次for 清除掉 ":\ "

回复

使用道具 举报

221#
 楼主| 发表于 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
回复

使用道具 举报

222#
发表于 2021-1-12 11:14:59 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-1-12 11:23 编辑
liuzhaoyzz 发表于 2021-1-12 11:10
fsutil fsinfo这样子的命令,在windows下面还行,如果用于pe,有的pe里面这样子的命令不支持,比如bootmg ...

如果在 pe 下,diskpart 恐怕也不能 十分把握的 找出 bcd 引导分区。因为有的是 虚拟盘 做的引导,有的是tftp,启动模式太多了,

估计这也是 为啥 diskpart  把 win 所在分区 定义为 boot/启动 ,他可能找的是用于启动系统的 winload.efi/exe 所在的位置

单从 pe 下获取 当前未占用 盘符 的 角度考虑 用 pecmd 获取结果最合适。

另外,pe 下判断 pe 本身 是由哪个 bcd 盘引导的,有啥意义么,可要是 在pe 下找出 本地硬盘系统是由哪个 分区的 bcd 体系引导的,就要找出这些 bcd 并分析 bcd文件的内容,这个 情况较复杂 如果本地存有多个硬盘,多个bcd 引导体系,你怎么办呢,有的时候 几个bcd 引导体系 都可以引导同一个 win ,有该在判断呢?

这个 判断当前系统 由哪个 bcd 分区引导 的 题目,大部分情况下,应该是在 本地系统下运行来实现的。

点评

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

使用道具 举报

223#
发表于 2021-1-12 11:30:49 | 只看该作者
CodeHz 发表于 2021-1-12 10:55
(不幸的是,fsutils的行为在不同系统有所区别,导致提取已分配盘符变得困难(https://ss64.org/viewtopic.p ...

dpx_3.4.cmd.7z (1.12 KB, 下载次数: 11)
回复

使用道具 举报

224#
 楼主| 发表于 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
回复

使用道具 举报

225#
发表于 2021-1-12 12:38:20 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-1-12 12:59 编辑
liuzhaoyzz 发表于 2021-1-12 11:52
是的,主要的使用环境和条件,大部分都是基于正常的windows环境。偶尔某些条件下,bootmgr/bootm ...

dpx_3.52.cmd.7z (1.32 KB, 下载次数: 17)

这个 脚本没有用到 fsutil 用的一个比较古老的办法,推算出未占用的盘符,但不知适用范围如何。
fsutil 的 部分也包含在内,只是没有调用。


点评

用这个版本,我在英文版win7下面测试,结果不对。 英文版win7,为了正常显示中文目录,国家我选择了中国,简体。[attachimg]472784[/attachimg]  详情 回复 发表于 2021-1-13 07:38
感谢大神,已收藏!  详情 回复 发表于 2021-1-12 13:26
回复

使用道具 举报

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

        感谢大神,已收藏!

点评

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

使用道具 举报

227#
发表于 2021-1-12 13:30:43 | 只看该作者
liuzhaoyzz 发表于 2021-1-12 13:26
感谢大神,已收藏!

pe 下恐怕 不适用 ,因为 diskpart 局限性和 pe 启动环境的复杂性。

点评

理解,我主要是用于正常的windows环境。谢谢了!  详情 回复 发表于 2021-1-12 13:35
回复

使用道具 举报

228#
 楼主| 发表于 2021-1-12 13:35:33 | 只看该作者
dos时代菜鸟 发表于 2021-1-12 13:30
pe 下恐怕 不适用 ,因为 diskpart 局限性和 pe 启动环境的复杂性。

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

使用道具 举报

229#
发表于 2021-1-12 13:45:22 来自手机 | 只看该作者
别考虑pe,pe是怎么启动的和硬盘上一毛钱关系也没有。

点评

说话别这么绝对,bootmgr/bootmgfw.efi→BCD→PE.WIM,这种情况,启动盘就是可以绝对确定的,怎么会没有关系?基本上只要是微软的bootmgr/bootmgfw.efi引导作为第一引导,不加入其他引导器中转,启动windows  详情 回复 发表于 2021-1-12 14:38
回复

使用道具 举报

230#
 楼主| 发表于 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,启动分区都是可以确定的。
回复

使用道具 举报

231#
发表于 2021-1-12 14:44:12 | 只看该作者
判断到pe咋启动的有啥意义?
你说的是硬盘上安装的pe?大部分人都是从优盘起来的pe,所以没多大意义。

点评

不是判断PE怎么启动的是,是确定引导分区。确定引导分区之后,我可以直接在PE下拷贝文件到引导分区什么的,不然的话,重启进入windows,确定启动分区,再拷贝文件?我说的是靠程序自动化识别,不是靠人眼看来确定这  详情 回复 发表于 2021-1-12 14:56
回复

使用道具 举报

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

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

使用道具 举报

233#
发表于 2021-1-12 15:09:21 来自手机 | 只看该作者
那哪判断的了,太难了吧,看看高手咋解决。

点评

168楼,CodeHz大神已经实现了啊,http://bbs.wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=423468&pid=4214093&fromuid=298214  详情 回复 发表于 2021-1-12 16:27
回复

使用道具 举报

234#
 楼主| 发表于 2021-1-12 16:27:58 | 只看该作者
窄口牛 发表于 2021-1-12 15:09
那哪判断的了,太难了吧,看看高手咋解决。

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

使用道具 举报

235#
发表于 2021-1-12 16:43:15 来自手机 | 只看该作者
哦,但是我这只能用后一个。
回复

使用道具 举报

236#
发表于 2021-1-12 23:16:19 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-1-13 00:02 编辑

刚研究了一下 vbs 调用 wmi 实现这个功能,发现了个惊喜,
瞬间 找到并挂载 bcd 启动卷。


cmd 代码如下:
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION

  3. rem 利用 wmi 获取当前系统的 bcd_vol 并为其分配盘符,参数 /d  卸载。

  4. set vbs_script="%temp%\bcd_vol.vbs"
  5. set 2ltr=Z

  6. >!vbs_script!                echo Set wmi=GetObject("winmgmts:\\.\root\cimv2")
  7. >>!vbs_script!                echo Set Parts=wmi.instancesof("Win32_Volume")
  8. >>!vbs_script!        echo For Each part In parts
  9. >>!vbs_script!        echo        If part.SystemVolume = True Then
  10. >>!vbs_script!        echo                wscript.echo part.DeviceID^&","^&part.DriveLetter
  11. >>!vbs_script!        echo        End If
  12. >>!vbs_script!        echo Next

  13. for /f "tokens=1,2 delims=," %%c in ('cscript //nologo !vbs_script!') do (
  14.         if not "%%c"=="" (
  15.                 if "%%d"=="" (
  16.                         mountvol !2ltr!:\ %%c
  17.                 ) else (
  18.                         if /i "%1"=="/d" mountvol %%d /d
  19.                
  20.                 )
  21.         )
  22. )

  23. cscript //nologo !vbs_script!

  24. del %temp%\bcd_vol.vbs


  25. pause
复制代码


点评

你的这段代码,我运行好像出错了。  详情 回复 发表于 2021-1-13 08:16
回复

使用道具 举报

237#
发表于 2021-1-12 23:25:15 | 只看该作者
527104427 发表于 2021-1-12 21:26
大家还这么热情高涨吗?我也来凑个热闹。
这两天请M大写了一段代码,用PECMD调取系统API来判断启动分区。
...

如何 调用 dll 内置函数 判断当前启动方式 为 uefi /传统  ?
pecmd 的 call 太深奥

点评

去问M大比较好,最近他好像挺有时间的。  详情 回复 发表于 2021-1-12 23:36
回复

使用道具 举报

238#
 楼主| 发表于 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
回复

使用道具 举报

239#
 楼主| 发表于 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结果是对的。
回复

使用道具 举报

240#
 楼主| 发表于 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结果是对的。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-4-23 19:30

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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