无忧启动论坛

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

[已解决] 求教:获取 bcdedit 执行结果字符串命令。

  [复制链接]
发表于 2022-3-27 18:11:05 | 显示全部楼层 |阅读模式
本帖最后由 lhc0688 于 2022-5-9 00:28 编辑

执行如下命令

bcdedit /copy {default} /d "Boot from WIM"

会返回结果 “已将该项成功复制到 {d355b3a4-ad8c-11ec-b338-b3781ffaf120}。”(不含引号)

现在希望获取  {d355b3a4-ad8c-11ec-b338-b3781ffaf120} 到变量,想请教坛内高手,批处理代码应该怎么写?

想法大致为:

1、能否直接把bcdedit /copy {default} /d "Boot from WIM"  命令执行结果传给变量?

比如:

for /F %%i in (bcdedit /copy {default} /d "Boot from WIM") do (set commitid=%%i)  (测试执行出错!)

2、通过输出到文本tt.txt,再获取:

比如:

bcdedit /copy {default} /d "Boot from WIM" > tt.txt
set guid_tmp = type tt.txt:~-3,-38%  (截取倒数第3位开始38位)   (语法有错误,不会写。。。)

请高手指点,先谢!
发表于 2022-3-27 19:20:55 | 显示全部楼层
  1. @Echo off&SetLocal EnableDelayedExpansion
  2. for /f "tokens=2 delims={" %%i in ('bcdedit /copy {default} /d "Boot from WIM"')do set n=%%i&echo !n:~0,-2!
  3. pause
复制代码

点评

bcdedit /copy /d "boot from wim" > temp.txt for /f "delims={} tokens=2" %%i in (temp.txt) do set ID={%%i} 然后ID这个变量里就有了ID(带花括号。)  详情 回复 发表于 2022-4-1 06:22
麻烦再问一下:这个怎么赋值给变量呢?实在是汗颜。  详情 回复 发表于 2022-3-27 19:40
太神奇了!直接出最终结果!可惜代码完全看不懂,佩服万分!  详情 回复 发表于 2022-3-27 19:29
太神奇了!直接出最终结果!可惜代码完全看不懂,佩服万分!  详情 回复 发表于 2022-3-27 19:28

评分

参与人数 1无忧币 +5 收起 理由
lhc0688 + 5 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2022-3-27 19:28:20 | 显示全部楼层

太神奇了!直接出最终结果!可惜代码完全看不懂,佩服万分!
回复

使用道具 举报

 楼主| 发表于 2022-3-27 19:28:49 | 显示全部楼层

太神奇了!直接出最终结果!可惜代码完全看不懂,佩服万分!
回复

使用道具 举报

 楼主| 发表于 2022-3-27 19:29:30 | 显示全部楼层

太神奇了!直接出最终结果!可惜代码完全看不懂,佩服万分!
回复

使用道具 举报

 楼主| 发表于 2022-3-27 19:40:12 | 显示全部楼层

麻烦再问一下:这个怎么赋值给变量呢?实在是汗颜。
回复

使用道具 举报

发表于 2022-3-27 19:43:46 | 显示全部楼层
!n:~0,-2!直接使用

点评

明白了,万分感谢!  发表于 2022-3-27 19:52
回复

使用道具 举报

发表于 2022-3-27 19:53:52 | 显示全部楼层
for /f "tokens=2 delims={}" %%i in ('bcdedit /copy {bootmgr} /d "Boot from WIM"') do (
   set ID={%%i}
)

点评

参数 {bootmgr} 创建成功但好像不是ESP盘的BCD,换 {default} 可以,这个我是否有操作上的误解?  发表于 2022-3-27 20:58
麻烦再多请教下:如何获取系统默认ESP分区?好像记得老大写过这方面程序,看能否指点。  详情 回复 发表于 2022-3-27 20:06
收到,也非常谢谢!都是高手,跟各位相比差距太大,惭愧。  发表于 2022-3-27 20:02

评分

参与人数 1无忧币 +5 收起 理由
lhc0688 + 5

查看全部评分

回复

使用道具 举报

发表于 2022-3-27 19:55:18 | 显示全部楼层
for /f 指令  括号内包含的命令应用单引号包裹。
回复

使用道具 举报

 楼主| 发表于 2022-3-27 20:06:46 | 显示全部楼层
江南一根葱 发表于 2022-3-27 19:53
for /f "tokens=2 delims={}" %%i in ('bcdedit /copy {bootmgr} /d "Boot from WIM"') do (
   set ID={% ...

麻烦再多请教下:如何获取系统默认ESP分区?好像记得老大写过这方面程序,看能否指点。

点评

正常系统下的话,只需要向bcd添加五个数据就可以正常启动pe wim所在分区盘符 wim所在分区路径(去盘符) boot.sdi所在分区判断 boot.sdi所在分区路径(去盘符) 启动环境 其他的参数按需要添加,不重要 可以说  详情 回复 发表于 2022-3-30 11:28
回复

使用道具 举报

 楼主| 发表于 2022-3-27 20:17:13 | 显示全部楼层
用命令给BCD增加一个WIM启动项的技术问题

-------------------------------------------------------------------------------------
经测试,拷贝启动项后,只需下面三个设置命令就可以正常加载引导ESP盘上的boot.wim:

bcdedit -set {d355b3ab-ad8c-11ec-b338-b3781ffaf120} device ramdisk="[boot]\boot.wim,{ramdiskoptions}"
bcdedit -set {d355b3ab-ad8c-11ec-b338-b3781ffaf120} path \Windows\system32\boot\winload.efi
bcdedit -set {d355b3ab-ad8c-11ec-b338-b3781ffaf120} winpe yes
-------------------------------------------------------------------------------------
目的:

现在已获取ID了,如果简单获取ESP分区编号并挂载为 Z:盘 ,然后复制boot.wim等文件到 Z:盘

下面是论坛 lintrainwy 坛友发的挂载命令:
原帖地址:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=385400

echo 正在挂载系统分区……
FOR /F "usebackq tokens=2 delims= " %%i in (` echo list disk ^|diskpart ^| find "磁盘" `) do (
        echo select disk=%%i>%temp%\t.txt
        echo list partition>>%temp%\t.txt
        FOR /F "usebackq tokens=2 delims= " %%j in (` diskpart /s %temp%\t.txt ^| find "系统" `) do (
                echo select disk=%%i>%temp%\t.txt
                echo select partition=%%j>>%temp%\t.txt
                echo assign>>%temp%\t.txt
                diskpart /s %temp%\t.txt>nul
        ) )


感觉比较复杂,有点难理解,不知道有没更简单的方法?

点评

经测试,拷贝启动项后,只需下面三个设置命令就可以正常加载引导ESP盘上的boot.wim 可以继续测试用bcdedit的deletevalue,将path删了。  详情 回复 发表于 2022-3-28 11:31
挂载当前 ESP 为卷 Z:  详情 回复 发表于 2022-3-27 20:29
回复

使用道具 举报

发表于 2022-3-27 20:29:44 | 显示全部楼层
lhc0688 发表于 2022-3-27 20:17
用命令给BCD增加一个WIM启动项的技术问题

---------------------------------------------------------- ...

挂载当前 ESP 为卷 Z:
  1. mountvol Z: /s
复制代码

点评

试了下,好像真的可以!难道就这么简单吗? 看论坛相关帖子都好像非常复杂,为何有直接挂载的命令不用呢?  详情 回复 发表于 2022-3-27 20:42
回复

使用道具 举报

 楼主| 发表于 2022-3-27 20:42:31 | 显示全部楼层
Bluebells 发表于 2022-3-27 20:29
挂载当前 ESP 为卷 Z:

试了下,好像真的可以!难道就这么简单吗?
看论坛相关帖子都好像非常复杂,为何有直接挂载的命令不用呢?

点评

mountvol Z: /s是比较差劲儿的办法。 多硬盘怎么办?比如说当前已经是优盘、本地硬盘启动了,我挂载另一个本地硬盘esp分区怎么办? 多个esp分区怎么办? 非微软体系的引导器引导的情况下怎么办? BIOS引导的情况  详情 回复 发表于 2022-3-30 18:31
回复

使用道具 举报

发表于 2022-3-28 11:31:28 | 显示全部楼层
lhc0688 发表于 2022-3-27 20:17
用命令给BCD增加一个WIM启动项的技术问题

---------------------------------------------------------- ...

经测试,拷贝启动项后,只需下面三个设置命令就可以正常加载引导ESP盘上的boot.wim

可以继续测试用bcdedit的deletevalue,将path删了。

点评

最终测试此方案(-copy)方式不好用,已放弃。  发表于 2022-3-28 11:55
回复

使用道具 举报

发表于 2022-3-28 13:13:47 | 显示全部楼层
好用的,别随便放弃。
回复

使用道具 举报

发表于 2022-3-29 08:44:16 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2022-3-29 08:50 编辑

bcdedit 获取 当前bcd 信息,是通过 api 句柄获取系统启动分区,并打开该分区上特定位置的 bcd 配置文件。

而论坛中的各路高手 往往 喜欢用 非微软的 引导器 间接引导其他硬盘上的 esp 分区上的 bootmgfw.efi 或active分区上的bootmgr来启动,此时再用 bcdedit 就 找不到 bcd配置文件。

再有就是 pe 环境下,往往也是 被 第三方引导器 带起来的,pe下 运行 bcdedit 也找不到 系统配置的 bcd

所以 才会考虑 用 分析各个硬盘分区,进而查找  启动分区 及其上的 bcd  的想法。

如果只是 在 一个官方正常启动的系统中  获取和修改 bcd启动项目和信息,完全可以用  bcdedit  完成,如果想挂载 启动的esp分区,用 mountvol 也可以。

论坛里面 讨论的 关于 处理 esp 分区 和 bcd 启动 的大部分 内容,都是基于 通过 u盘启动 pe 后,对已经瘫痪的系统开展维护,这个前提下,开展的。

点评

uefi模式启动的pe,貌似直接bcdedit可以获取到离线系统的启动bcd项,我前两天发现的 应该是bcdedit和固件打了交道  详情 回复 发表于 2022-3-30 11:23
谢谢解答!好像明白一点了。  发表于 2022-3-29 10:29
回复

使用道具 举报

发表于 2022-3-30 11:23:56 来自手机 | 显示全部楼层
dos时代菜鸟 发表于 2022-3-29 08:44
bcdedit 获取 当前bcd 信息,是通过 api 句柄获取系统启动分区,并打开该分区上特定位置的 bcd 配置文件。
...

uefi模式启动的pe,貌似直接bcdedit可以获取到离线系统的启动bcd项,我前两天发现的
应该是bcdedit和固件打了交道

点评

uefi模式启动的pe,BCDEDIT是去找GPT的引导区,如果离线系统是MBR+UEFI,试试能不能找到。 系统下bcdedit bcdboot都会知道引导模式和引导区在哪,所以不需要判断,也不需要挂载。 非第三方引导的情况下。  详情 回复 发表于 2022-3-30 13:39
你是通过 u盘 启动 的pe 么? bcdedit 不带 /store 会访问 当前系统启动分区上的 特定位置的 bcd 数据。 如果 用 u盘 启动 ,能 不带 /store 参数 自动调取到 本地系统 bcd ,那算是个 大发现。  详情 回复 发表于 2022-3-30 11:52
回复

使用道具 举报

发表于 2022-3-30 11:28:49 来自手机 | 显示全部楼层
lhc0688 发表于 2022-3-27 20:06
麻烦再多请教下:如何获取系统默认ESP分区?好像记得老大写过这方面程序,看能否指点。

正常系统下的话,只需要向bcd添加五个数据就可以正常启动pe
wim所在分区盘符
wim所在分区路径(去盘符)
boot.sdi所在分区判断
boot.sdi所在分区路径(去盘符)
启动环境

其他的参数按需要添加,不重要
可以说,大部分帖子描述的方式是错误的
回复

使用道具 举报

发表于 2022-3-30 11:52:07 | 显示全部楼层
江南一根葱 发表于 2022-3-30 11:23
uefi模式启动的pe,貌似直接bcdedit可以获取到离线系统的启动bcd项,我前两天发现的
应该是bcdedit和固 ...

你是通过 u盘 启动 的pe 么?
bcdedit 不带 /store 会访问 当前系统启动分区上的 特定位置的 bcd 数据。
如果 用 u盘 启动 ,能 不带 /store 参数 自动调取到 本地系统 bcd ,那算是个 大发现。

点评

是虚拟机iso启动的,离线系统是uefi的win7  详情 回复 发表于 2022-3-30 13:40
回复

使用道具 举报

发表于 2022-3-30 13:39:46 | 显示全部楼层
江南一根葱 发表于 2022-3-30 11:23
uefi模式启动的pe,貌似直接bcdedit可以获取到离线系统的启动bcd项,我前两天发现的
应该是bcdedit和固 ...

uefi模式启动的pe,BCDEDIT是去找GPT的引导区,如果离线系统是MBR+UEFI,试试能不能找到。

系统下bcdedit bcdboot都会知道引导模式和引导区在哪,所以不需要判断,也不需要挂载。
非第三方引导的情况下。
回复

使用道具 举报

发表于 2022-3-30 13:40:57 | 显示全部楼层
dos时代菜鸟 发表于 2022-3-30 11:52
你是通过 u盘 启动 的pe 么?
bcdedit 不带 /store 会访问 当前系统启动分区上的 特定位置的 bcd 数据。
...

是虚拟机iso启动的,离线系统是uefi的win7

点评

了解, 我也试试  详情 回复 发表于 2022-3-30 21:27
回复

使用道具 举报

发表于 2022-3-30 18:31:00 来自手机 | 显示全部楼层
lhc0688 发表于 2022-3-27 20:42
试了下,好像真的可以!难道就这么简单吗?
看论坛相关帖子都好像非常复杂,为何有直接挂载的命令不用呢 ...

mountvol Z: /s是比较差劲儿的办法。
多硬盘怎么办?比如说当前已经是优盘、本地硬盘启动了,我挂载另一个本地硬盘esp分区怎么办?
多个esp分区怎么办?
非微软体系的引导器引导的情况下怎么办?
BIOS引导的情况下挂载另一个GPT硬盘的ESP分区怎么办?

点评

可以考虑 搜索所有分区中的系统,读取他们注册表指定位置,确定其最后一次启动该系统的BCD所在分区,然后 找到这个BCD,读取其信息。  详情 回复 发表于 2022-3-30 22:13
回复

使用道具 举报

发表于 2022-3-30 21:27:33 来自手机 | 显示全部楼层
江南一根葱 发表于 2022-3-30 13:40
是虚拟机iso启动的,离线系统是uefi的win7

了解,
我也试试
回复

使用道具 举报

发表于 2022-3-30 22:13:58 来自手机 | 显示全部楼层
liuzhaoyzz 发表于 2022-3-30 18:31
mountvol Z: /s是比较差劲儿的办法。
多硬盘怎么办?比如说当前已经是优盘、本地硬盘启动了,我挂载另一 ...

可以考虑 搜索所有分区中的系统,读取他们注册表指定位置,确定其最后一次启动该系统的BCD所在分区,然后 找到这个BCD,读取其信息。

点评

我目前用的逻辑是搜索所有分区,存在boot\bcd写入传统bios引导项 存在efi\microsoft\boot\bcd就写入uefi引导项 bcdedit支持 \\?\Volume{7f92197b-0000-0000-0000-100000000000}\ 这种路径,并不需要挂载  详情 回复 发表于 2022-3-31 09:50
这个思路不对。 并非所有的系统存在于物理硬盘上,有的系统存在于虚拟硬盘上面,比如vhd上面,vhd没有挂载,何谈BCD?何谈搜索? ESP分区挂载与BCD没有必然的联系,本身就可以单独挂载。 对于裸机系统,从PE启动  详情 回复 发表于 2022-3-31 09:09
回复

使用道具 举报

发表于 2022-3-31 09:09:00 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2022-3-31 09:12 编辑
dos时代菜鸟 发表于 2022-3-30 22:13
可以考虑 搜索所有分区中的系统,读取他们注册表指定位置,确定其最后一次启动该系统的BCD所在分区,然后 ...

这个思路不对。
并非所有的系统存在于物理硬盘上,有的系统存在于虚拟硬盘上面,比如vhd上面,vhd没有挂载,何谈BCD?何谈搜索?
ESP分区挂载与BCD没有必然的联系,本身就可以单独挂载。
对于裸机系统,从PE启动的,也是没有有效的BCD。比如在PE下面我想挂载ESP分区怎么办?
这不是抬杠,这是使用的场景不同,由此决定了需求不同。

点评

都vhd系统了,你不会在这种应用场景使用这种批处理的 所以,这可能就是抬杠,  详情 回复 发表于 2022-3-31 09:47
回复

使用道具 举报

发表于 2022-3-31 09:47:43 | 显示全部楼层
liuzhaoyzz 发表于 2022-3-31 09:09
这个思路不对。
并非所有的系统存在于物理硬盘上,有的系统存在于虚拟硬盘上面,比如vhd上面,vhd没有挂 ...

都vhd系统了,你不会在这种应用场景使用这种批处理的
所以,这可能就是抬杠,

点评

我的系统都是vhd,我就是有这个命令行挂载ESP分区写文件的需求。不是抬杠。  详情 回复 发表于 2022-3-31 13:32
回复

使用道具 举报

发表于 2022-3-31 09:50:04 | 显示全部楼层
dos时代菜鸟 发表于 2022-3-30 22:13
可以考虑 搜索所有分区中的系统,读取他们注册表指定位置,确定其最后一次启动该系统的BCD所在分区,然后 ...

我目前用的逻辑是搜索所有分区,存在boot\bcd写入传统bios引导项
存在efi\microsoft\boot\bcd就写入uefi引导项
bcdedit支持 \\?\Volume{7f92197b-0000-0000-0000-100000000000}\ 这种路径,并不需要挂载

点评

貌似所有的 cmd 命令 都自持 类似 这样 \\?\Volume{7f92197b-0000-0000-0000-100000000000}\ 的 卷路径  详情 回复 发表于 2022-3-31 13:14
双启也是独立引导区为好,有群友MBR引导区ID设为1B未成功\\?方式,在当前系统中安装WIMPE还是BCDBOOT+BCDEDIT靠谱,不用查找引导区,不用挂载。 以上是微软引导方式,VHD也没问题,第三方引导的就去第三方里加PE  详情 回复 发表于 2022-3-31 10:21
回复

使用道具 举报

发表于 2022-3-31 10:21:18 | 显示全部楼层
江南一根葱 发表于 2022-3-31 09:50
我目前用的逻辑是搜索所有分区,存在boot\bcd写入传统bios引导项
存在efi\microsoft\boot\bcd就写入uefi ...

双启也是独立引导区为好,有群友MBR引导区ID设为1B未成功\\?方式,在当前系统中安装WIMPE还是BCDBOOT+BCDEDIT靠谱,不用查找引导区,不用挂载。

以上是微软引导方式,VHD也没问题,第三方引导的就去第三方里加PE吧。

点评

当前系统安装那肯定了,不需要考虑什么多硬盘之类的情况  详情 回复 发表于 2022-3-31 10:30
回复

使用道具 举报

发表于 2022-3-31 10:26:34 | 显示全部楼层
BCDBOOT会判断引导模式,不需要自己判断。
BCDEDIT会找到正确的BCD。

点评

pe是传统bios,离线系统是uefi,或者反之,这种情况是很常见的,我平时也是uefi的pe,传统bios启动的离线 bcdboot不知道能不能判断  详情 回复 发表于 2022-3-31 10:29
回复

使用道具 举报

发表于 2022-3-31 10:29:30 | 显示全部楼层
szwp 发表于 2022-3-31 10:26
BCDBOOT会判断引导模式,不需要自己判断。
BCDEDIT会找到正确的BCD。

pe是传统bios,离线系统是uefi,或者反之,这种情况是很常见的,我平时也是uefi的pe,传统bios启动的离线
bcdboot不知道能不能判断

点评

前提是当前系统下安装WIMPE。  详情 回复 发表于 2022-3-31 10:30
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-12-5 10:19

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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