找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 94|回复: 4

[文件操作] 再求助:如何提取 EFI 所在分区的盘符(多为隐藏分区)

[复制链接]
发表于 昨天 18:06 | 显示全部楼层 |阅读模式
本帖最后由 766266yyn 于 2026-7-31 18:11 编辑

如题
想制作一个批处理--WinPE 安装到本地硬盘工具,需要提取引导分区的 BCD 文件,编辑后再复制回去。难题是:发现 Win10 系统下
引导分区是隐藏的,有盘符;而 Win11 系统下引导分区既隐藏,又无盘符。如果在本地系统下,可以用 bcdedit.exe 直接编辑,而
请教:在 WinPE 环境下 EFI 所在分区的盘符如何提取?
或者:在 WinPE 环境下如何编辑处理本地系统的 BCD 文件?
发表于 昨天 20:14 | 显示全部楼层
本帖最后由 77七 于 2026-7-31 22:44 编辑

单 EFI 系统分区,在 WinPE 中执行:

  1. rem 将 EFI 系统分区临时挂载为 S:
  2. mountvol S: /S

  3. set "BCD=S:\EFI\Microsoft\Boot\BCD"

  4. if exist "%BCD%" (
  5.     echo EFI分区:S:
  6.     echo BCD文件:%BCD%
  7.     bcdedit /store "%BCD%" /enum all
  8. ) else (
  9.     echo 没有找到 Windows BCD 文件。
  10. )
  11. rem 编辑完成后取消挂载
  12. mountvol S: /D
复制代码


多 EFI 系统分区,在 WinPE 中执行:

  1. @echo off
  2. setlocal EnableExtensions EnableDelayedExpansion

  3. rem =========================================================
  4. rem Windows分区盘符。
  5. rem 留空表示自动查找;也可以手工指定,例如:
  6. rem set "WinDrive=D:"
  7. rem =========================================================
  8. set "WinDrive="

  9. set "DPScript=%temp%\FindESP_%random%_%random%.txt"
  10. set "DPOutput=%temp%\FindESP_%random%_%random%.log"

  11. rem =========================================================
  12. rem 自动查找Windows分区
  13. rem 排除X盘,因为X盘通常是当前WinPE
  14. rem =========================================================
  15. if not defined WinDrive (
  16.     for %%D in (
  17.         C D E F G H I J K L M N O P Q R S T U V W Y Z
  18.     ) do (
  19.         if exist "%%D:\Windows\System32\Config\SYSTEM" (
  20.             if defined WinDrive (
  21.                 echo.
  22.                 echo [错误] 检测到多个Windows分区:
  23.                 echo        !WinDrive!
  24.                 echo        %%D:
  25.                 echo.
  26.                 echo 请在脚本开头手工设置 WinDrive。
  27.                 goto :Error
  28.             )
  29.             set "WinDrive=%%D:"
  30.         )
  31.     )
  32. )

  33. if not defined WinDrive (
  34.     echo [错误] 没有找到Windows分区。
  35.     echo 如果Windows分区使用BitLocker,请先解锁。
  36.     goto :Error
  37. )

  38. if not exist "%WinDrive%\Windows\System32\Config\SYSTEM" (
  39.     echo [错误] 指定的Windows分区不正确:%WinDrive%
  40.     goto :Error
  41. )

  42. echo Windows分区:%WinDrive%

  43. rem =========================================================
  44. rem 查找一个当前未使用的临时盘符
  45. rem =========================================================
  46. for %%D in (S R Q P O N M L K J I H G F E Y Z) do (
  47.     if not exist "%%D:\" (
  48.         set "TempLetter=%%D:"
  49.         goto :TempLetterFound
  50.     )
  51. )

  52. echo [错误] 没有可用的临时盘符。
  53. goto :Error

  54. :TempLetterFound
  55. echo 临时盘符:%TempLetter%

  56. rem =========================================================
  57. rem 根据Windows卷查出它所在的物理磁盘编号
  58. rem =========================================================
  59. > "%DPScript%" echo select volume=%WinDrive:~0,1%
  60. >>"%DPScript%" echo detail volume
  61. >>"%DPScript%" echo exit

  62. diskpart /s "%DPScript%" >"%DPOutput%" 2>&1

  63. rem 同时兼容简体中文、繁体中文和英文DiskPart
  64. for /f "tokens=3" %%N in ('
  65.     findstr /l /c:"* Disk " /c:"* 磁盘 " /c:"* 磁碟 " "%DPOutput%"
  66. ') do (
  67.     if not defined DiskNumber set "DiskNumber=%%N"
  68. )

  69. if not defined DiskNumber (
  70.     echo [错误] 无法取得Windows所在的物理磁盘编号。
  71.     goto :Error
  72. )

  73. echo 物理磁盘:%DiskNumber%

  74. rem =========================================================
  75. rem 列出这个物理磁盘上的全部分区
  76. rem =========================================================
  77. > "%DPScript%" echo select disk=%DiskNumber%
  78. >>"%DPScript%" echo list partition
  79. >>"%DPScript%" echo exit

  80. diskpart /s "%DPScript%" >"%DPOutput%" 2>&1

  81. rem =========================================================
  82. rem 逐个给分区临时分配盘符,检查Windows BCD
  83. rem =========================================================
  84. for /f "tokens=2" %%P in ('
  85.     findstr /r ^
  86.     /c:"^[ ]*Partition [0-9][0-9]*" ^
  87.     /c:"^[ ]*分区 [0-9][0-9]*" ^
  88.     /c:"^[ ]*分割區 [0-9][0-9]*" ^
  89.     "%DPOutput%"
  90. ') do (
  91.     call :CheckPartition %%P
  92. )

  93. if not defined BCDFile (
  94.     echo.
  95.     echo [错误] 在磁盘%DiskNumber%上没有找到:
  96.     echo        \EFI\Microsoft\Boot\BCD
  97.     goto :Error
  98. )

  99. echo.
  100. echo 找到EFI分区:%ESPDrive%
  101. echo BCD文件路径:%BCDFile%
  102. echo.

  103. rem =========================================================
  104. rem 以下直接编辑本地Windows的离线BCD
  105. rem =========================================================

  106. bcdedit /store "%BCDFile%" /enum all

  107. rem 示例:将启动菜单等待时间设置为5秒
  108. rem bcdedit /store "%BCDFile%" /timeout 5

  109. rem 示例:后续添加WinPE启动项时,
  110. rem 每一条bcdedit命令都必须带上:
  111. rem /store "%BCDFile%"

  112. echo.
  113. echo BCD处理完成。

  114. rem 撤销临时盘符
  115. mountvol %ESPDrive% /D >nul 2>&1

  116. del "%DPScript%" "%DPOutput%" >nul 2>&1
  117. endlocal
  118. exit /b 0


  119. :CheckPartition
  120. if defined BCDFile exit /b

  121. > "%DPScript%" echo select disk=%DiskNumber%
  122. >>"%DPScript%" echo select partition=%1
  123. >>"%DPScript%" echo assign letter=%TempLetter:~0,1% noerr
  124. >>"%DPScript%" echo exit

  125. diskpart /s "%DPScript%" >nul 2>&1

  126. if exist "%TempLetter%\EFI\Microsoft\Boot\BCD" (
  127.     set "ESPDrive=%TempLetter%"
  128.     set "BCDFile=%TempLetter%\EFI\Microsoft\Boot\BCD"
  129.     exit /b
  130. )

  131. rem 如果这次成功分配了临时盘符,但不是目标分区,则撤销
  132. if exist "%TempLetter%\" (
  133.     mountvol %TempLetter% /D >nul 2>&1
  134. )

  135. exit /b


  136. :Error
  137. if defined ESPDrive mountvol %ESPDrive% /D >nul 2>&1
  138. del "%DPScript%" "%DPOutput%" >nul 2>&1
  139. endlocal
  140. exit /b 1
复制代码

 楼主| 发表于 昨天 21:48 | 显示全部楼层
77七 发表于 2026-7-31 20:14
ai答复,有点长

谢谢 77七 老师,这个太复杂了,看不懂了
发表于 昨天 22:41 | 显示全部楼层
766266yyn 发表于 2026-7-31 21:48
谢谢 77七 老师,这个太复杂了,看不懂了

看来答案越详细,越是难懂,已经优化2楼。
发表于 昨天 23:11 | 显示全部楼层
给个文字说明吧
先用wmic查找 ,比如
  1. wmic path win32_volume where "SystemVolume=TRUE" get name /value
复制代码

查找后判断是否是盘符, 有盘符的的会输出盘符(c:\), 没盘符的会输出一串东西(\\?\Volume{11111111-2222-333-444-555555555555}\)
将没盘符的一串东西里面的反斜杠加倍后再次用wmic查找, 然后调用mount挂载, 如
  1. wmic path win32_volume where "name='\\\\?\\Volume{11111111-2222-333-444-555555555555}\\'" call mount
复制代码

调用后应该会有盘符了, 再一次用wimc查询并获取盘符, 如
  1. wmic path win32_volume where "DeviceID='\\\\?\\Volume{11111111-2222-333-444-555555555555}\\'" get name /value
复制代码

获取盘符后就用bcdedit或bcdboot操作, 操作完最后再再一次用wmic查询并调用dismount取消挂载, 如
  1. wmic path win32_volume where "DeviceID='\\\\?\\Volume{11111111-2222-333-444-555555555555}\\'" call dismount
复制代码




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

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-8-1 06:08

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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