无忧启动论坛

标题: 求教:获取 bcdedit 执行结果字符串命令。 [打印本页]

作者: lhc0688    时间: 2022-3-27 18:11
标题: 求教:获取 bcdedit 执行结果字符串命令。
本帖最后由 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位)   (语法有错误,不会写。。。)

请高手指点,先谢!

作者: smss    时间: 2022-3-27 19:20
  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
复制代码

作者: lhc0688    时间: 2022-3-27 19:28
smss 发表于 2022-3-27 19:20

太神奇了!直接出最终结果!可惜代码完全看不懂,佩服万分!
作者: lhc0688    时间: 2022-3-27 19:28
smss 发表于 2022-3-27 19:20

太神奇了!直接出最终结果!可惜代码完全看不懂,佩服万分!
作者: lhc0688    时间: 2022-3-27 19:29
smss 发表于 2022-3-27 19:20

太神奇了!直接出最终结果!可惜代码完全看不懂,佩服万分!
作者: lhc0688    时间: 2022-3-27 19:40
smss 发表于 2022-3-27 19:20

麻烦再问一下:这个怎么赋值给变量呢?实在是汗颜。
作者: smss    时间: 2022-3-27 19:43
!n:~0,-2!直接使用
作者: 江南一根葱    时间: 2022-3-27 19:53
for /f "tokens=2 delims={}" %%i in ('bcdedit /copy {bootmgr} /d "Boot from WIM"') do (
   set ID={%%i}
)
作者: dos时代菜鸟    时间: 2022-3-27 19:55
for /f 指令  括号内包含的命令应用单引号包裹。

作者: lhc0688    时间: 2022-3-27 20:06
江南一根葱 发表于 2022-3-27 19:53
for /f "tokens=2 delims={}" %%i in ('bcdedit /copy {bootmgr} /d "Boot from WIM"') do (
   set ID={% ...

麻烦再多请教下:如何获取系统默认ESP分区?好像记得老大写过这方面程序,看能否指点。
作者: lhc0688    时间: 2022-3-27 20:17
用命令给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
        ) )


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

作者: Bluebells    时间: 2022-3-27 20:29
lhc0688 发表于 2022-3-27 20:17
用命令给BCD增加一个WIM启动项的技术问题

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

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


作者: lhc0688    时间: 2022-3-27 20:42
Bluebells 发表于 2022-3-27 20:29
挂载当前 ESP 为卷 Z:

试了下,好像真的可以!难道就这么简单吗?
看论坛相关帖子都好像非常复杂,为何有直接挂载的命令不用呢?
作者: szwp    时间: 2022-3-28 11:31
lhc0688 发表于 2022-3-27 20:17
用命令给BCD增加一个WIM启动项的技术问题

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

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

可以继续测试用bcdedit的deletevalue,将path删了。
作者: szwp    时间: 2022-3-28 13:13
好用的,别随便放弃。
作者: dos时代菜鸟    时间: 2022-3-29 08:44
本帖最后由 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 后,对已经瘫痪的系统开展维护,这个前提下,开展的。

作者: 江南一根葱    时间: 2022-3-30 11:23
dos时代菜鸟 发表于 2022-3-29 08:44
bcdedit 获取 当前bcd 信息,是通过 api 句柄获取系统启动分区,并打开该分区上特定位置的 bcd 配置文件。
...

uefi模式启动的pe,貌似直接bcdedit可以获取到离线系统的启动bcd项,我前两天发现的
应该是bcdedit和固件打了交道
作者: 江南一根葱    时间: 2022-3-30 11:28
lhc0688 发表于 2022-3-27 20:06
麻烦再多请教下:如何获取系统默认ESP分区?好像记得老大写过这方面程序,看能否指点。

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

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

作者: dos时代菜鸟    时间: 2022-3-30 11:52
江南一根葱 发表于 2022-3-30 11:23
uefi模式启动的pe,貌似直接bcdedit可以获取到离线系统的启动bcd项,我前两天发现的
应该是bcdedit和固 ...

你是通过 u盘 启动 的pe 么?
bcdedit 不带 /store 会访问 当前系统启动分区上的 特定位置的 bcd 数据。
如果 用 u盘 启动 ,能 不带 /store 参数 自动调取到 本地系统 bcd ,那算是个 大发现。
作者: szwp    时间: 2022-3-30 13:39
江南一根葱 发表于 2022-3-30 11:23
uefi模式启动的pe,貌似直接bcdedit可以获取到离线系统的启动bcd项,我前两天发现的
应该是bcdedit和固 ...

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

系统下bcdedit bcdboot都会知道引导模式和引导区在哪,所以不需要判断,也不需要挂载。
非第三方引导的情况下。
作者: 江南一根葱    时间: 2022-3-30 13:40
dos时代菜鸟 发表于 2022-3-30 11:52
你是通过 u盘 启动 的pe 么?
bcdedit 不带 /store 会访问 当前系统启动分区上的 特定位置的 bcd 数据。
...

是虚拟机iso启动的,离线系统是uefi的win7
作者: liuzhaoyzz    时间: 2022-3-30 18:31
lhc0688 发表于 2022-3-27 20:42
试了下,好像真的可以!难道就这么简单吗?
看论坛相关帖子都好像非常复杂,为何有直接挂载的命令不用呢 ...

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

作者: dos时代菜鸟    时间: 2022-3-30 21:27
江南一根葱 发表于 2022-3-30 13:40
是虚拟机iso启动的,离线系统是uefi的win7

了解,
我也试试
作者: dos时代菜鸟    时间: 2022-3-30 22:13
liuzhaoyzz 发表于 2022-3-30 18:31
mountvol Z: /s是比较差劲儿的办法。
多硬盘怎么办?比如说当前已经是优盘、本地硬盘启动了,我挂载另一 ...

可以考虑 搜索所有分区中的系统,读取他们注册表指定位置,确定其最后一次启动该系统的BCD所在分区,然后 找到这个BCD,读取其信息。
作者: liuzhaoyzz    时间: 2022-3-31 09:09
本帖最后由 liuzhaoyzz 于 2022-3-31 09:12 编辑
dos时代菜鸟 发表于 2022-3-30 22:13
可以考虑 搜索所有分区中的系统,读取他们注册表指定位置,确定其最后一次启动该系统的BCD所在分区,然后 ...

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

作者: 江南一根葱    时间: 2022-3-31 09:47
liuzhaoyzz 发表于 2022-3-31 09:09
这个思路不对。
并非所有的系统存在于物理硬盘上,有的系统存在于虚拟硬盘上面,比如vhd上面,vhd没有挂 ...

都vhd系统了,你不会在这种应用场景使用这种批处理的
所以,这可能就是抬杠,
作者: 江南一根葱    时间: 2022-3-31 09:50
dos时代菜鸟 发表于 2022-3-30 22:13
可以考虑 搜索所有分区中的系统,读取他们注册表指定位置,确定其最后一次启动该系统的BCD所在分区,然后 ...

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

作者: szwp    时间: 2022-3-31 10:21
江南一根葱 发表于 2022-3-31 09:50
我目前用的逻辑是搜索所有分区,存在boot\bcd写入传统bios引导项
存在efi\microsoft\boot\bcd就写入uefi ...

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

以上是微软引导方式,VHD也没问题,第三方引导的就去第三方里加PE吧。
作者: szwp    时间: 2022-3-31 10:26
BCDBOOT会判断引导模式,不需要自己判断。
BCDEDIT会找到正确的BCD。
作者: 江南一根葱    时间: 2022-3-31 10:29
szwp 发表于 2022-3-31 10:26
BCDBOOT会判断引导模式,不需要自己判断。
BCDEDIT会找到正确的BCD。

pe是传统bios,离线系统是uefi,或者反之,这种情况是很常见的,我平时也是uefi的pe,传统bios启动的离线
bcdboot不知道能不能判断
作者: szwp    时间: 2022-3-31 10:30
江南一根葱 发表于 2022-3-31 10:29
pe是传统bios,离线系统是uefi,或者反之,这种情况是很常见的,我平时也是uefi的pe,传统bios启动的离线
...

前提是当前系统下安装WIMPE。
作者: 江南一根葱    时间: 2022-3-31 10:30
szwp 发表于 2022-3-31 10:21
双启也是独立引导区为好,有群友MBR引导区ID设为1B未成功\\?方式,在当前系统中安装WIMPE还是BCDBOOT+BCD ...

当前系统安装那肯定了,不需要考虑什么多硬盘之类的情况

作者: szwp    时间: 2022-3-31 10:40
离线的话,最好在空盘时就合理规划好分区,4T以下还是MBR方式兼容双启,独立引导区+通用BCD,安装系统前就将PE放上去,然后脱离U盘或网启,用本地硬盘继续剩余的活。
即使老机不支持UEFI,也要考虑将来硬盘可能会在新机上用。

如果已有系统,再离线安装PE,情况就比较复杂,会有多引导区存在,没法知道以后用户会用哪个引导区,会不会切换启动,要么全给加上,要么判断log最近日期找最后引导的区。
作者: wang@qq.com    时间: 2022-3-31 11:42
本帖最后由 wang@qq.com 于 2022-3-31 11:45 编辑

我这里有33#--szwp提供的打开(无挂载点)分区的批处理,可以参考一下欢迎进QQ:1067888280群讨论引导

打开esp.cmd.txt

433 Bytes, 下载次数: 4, 下载积分: 无忧币 -2


作者: szwp    时间: 2022-3-31 12:20
wang@qq.com 发表于 2022-3-31 11:42
我这里有33#--szwp提供的打开(无挂载点)分区的批处理,可以参考一下欢迎进QQ:1067888280群讨论引导

这不是处理当前系统添加WIMPE用的。不需要打开分区。
这不是俺写的,是另一种场景提供的一种思路。
作者: dos时代菜鸟    时间: 2022-3-31 13:14
江南一根葱 发表于 2022-3-31 09:50
我目前用的逻辑是搜索所有分区,存在boot\bcd写入传统bios引导项
存在efi\microsoft\boot\bcd就写入uefi ...

貌似所有的 cmd 命令 都自持
类似 这样  \\?\Volume{7f92197b-0000-0000-0000-100000000000}\
的 卷路径
作者: dos时代菜鸟    时间: 2022-3-31 13:20
liuzhaoyzz 发表于 2022-3-31 09:09
这个思路不对。
并非所有的系统存在于物理硬盘上,有的系统存在于虚拟硬盘上面,比如vhd上面,vhd没有挂 ...

vhd 的话
如果是第三方引导器 引导 vhd 中的 bcd 启动vhd 中的系统,那就没必要 用 这样的搜索了。

但通常 我都是用  微软的 bootmgr /bootmgfw.efi 之类的 直接引导 硬盘上的 bcd 引导硬盘上的 vhd ,启动 vhd 中的系统。

而更多的时候,是 把系统安装在 正常的硬盘分区上,因为 这样可以 有休眠功能。
作者: liuzhaoyzz    时间: 2022-3-31 13:32
江南一根葱 发表于 2022-3-31 09:47
都vhd系统了,你不会在这种应用场景使用这种批处理的
所以,这可能就是抬杠,

我的系统都是vhd,我就是有这个命令行挂载ESP分区写文件的需求。不是抬杠。
作者: szwp    时间: 2022-3-31 15:22
liuzhaoyzz 发表于 2022-3-31 13:32
我的系统都是vhd,我就是有这个命令行挂载ESP分区写文件的需求。不是抬杠。

如果是微软方式引导的VHD系统 ,不用担心BCDEDIT和BCDBOOT找不到引导区,即使是VHD RAMOS。
作者: winpefk    时间: 2022-4-1 06:22
smss 发表于 2022-3-27 19:20

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-2 09:54
liuzhaoyzz 发表于 2022-3-31 13:32
我的系统都是vhd,我就是有这个命令行挂载ESP分区写文件的需求。不是抬杠。

我试了下,记得你是只从硬盘启动pe的
如果从硬盘启动pe,不管是bios还是uefi
bcdedit直接可以对硬盘里的bcd进行操作,根本无须查找,pe好像知道它是从哪里启动的
也可以直接像正常系统里一样添加引导,无须-store指定路径,也无须满地查找它是从哪里启动的,
作者: 江南一根葱    时间: 2022-4-2 10:01
szwp 发表于 2022-3-31 10:40
离线的话,最好在空盘时就合理规划好分区,4T以下还是MBR方式兼容双启,独立引导区+通用BCD,安装系统前就 ...

我也觉得不如找得到就全给加上
不然引导也可能在vhd上, 更可能在隔壁老王家
这引导关系变得永远说不清道不明了
作者: liuzhaoyzz    时间: 2022-4-2 10:51
本帖最后由 liuzhaoyzz 于 2022-4-2 10:57 编辑
江南一根葱 发表于 2022-4-2 09:54
我试了下,记得你是只从硬盘启动pe的
如果从硬盘启动pe,不管是bios还是uefi
bcdedit直接可以对硬盘里 ...
bcdedit直接可以对硬盘里的bcd进行操作

问题是我不是这个需求啊,比如我想挂载ESP分区之后,向里面拷贝文件grub2x64.efi,boot.sdi等等之类的,并非仅仅局限于修改BCD。

启动PE.WIM,还需要boot.sdi啊,就算bcdedit直接可以改硬盘里的bcd,不拷贝boot.sdi的话光改好了bcd也没用啊。

作者: dfw9    时间: 2022-4-2 10:59
本帖最后由 dfw9 于 2022-4-2 11:00 编辑
liuzhaoyzz 发表于 2022-4-2 10:51
问题是我不是这个需求啊,比如我想挂载ESP分区之后,向里面拷贝文件grub2x64.efi,boot.sdi等等之类的 ...

或许有人可以往ESP里直接塞入wim、vhd呢?
作者: szwp    时间: 2022-4-2 10:59
liuzhaoyzz 发表于 2022-4-2 10:51
问题是我不是这个需求啊,比如我想挂载ESP分区之后,向里面拷贝文件grub2x64.efi,boot.sdi等等之类的 ...

可用BCDBOOT实现
作者: 江南一根葱    时间: 2022-4-2 11:06
liuzhaoyzz 发表于 2022-4-2 10:51
问题是我不是这个需求啊,比如我想挂载ESP分区之后,向里面拷贝文件grub2x64.efi,boot.sdi等等之类的 ...

boot.sdi可以在任意位置,这又不是个问题,
作者: szwp    时间: 2022-4-2 11:18
需求是挂载么?这个路绕得远了。
作者: wang@qq.com    时间: 2022-4-2 11:24
搞不懂是要自动化还是手动?
作者: wang@qq.com    时间: 2022-4-2 11:26
esp分区批处理命令直接打开不比挂载好?
作者: wang@qq.com    时间: 2022-4-2 11:30
关于id为什么一定要去获取?自己编一个id再bcdedit




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3