无忧启动论坛

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

删除 bcd 中指定项目的 脚本

[复制链接]
跳转到指定楼层
1#
发表于 2018-3-7 23:53:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dos时代菜鸟 于 2018-3-10 21:14 编辑

发俩脚本,活跃下气氛。
脚本需要 bcdedit.exe

bcd_delete.cmd
  1. @echo off && setlocal ENABLEDELAYEDEXPANSION
  2. rem  附带参数用来指定 要操作的 bcd 文件,如果空,表示对当前bcd操作
  3. title "删除 BCD 启动项目"
  4. color 0a
  5. mode con: lines=40
  6. :top0
  7.   set bcd=
  8.   if not *%1==* set bcd=%1
  9.   if *%bcd%==*  (set /p bcd=请输入bcd位置,如:C:\BOOT\BCD,回车确认,x退出,默认当前BCD:)
  10.   if  *%bcd%==* (echo BCD=当前 & bcdedit /v >nul 2>nul ) else (echo BCD=%bcd%  & bcdedit /store %bcd% /v >nul 2>nul)
  11.   if errorleveL 1 (echo BCD错误,按任意键重新选择 & PAUSE >NUL & goto top0 )

  12. :top
  13.   if not *%bcd%*==** set bcd_p=/store %bcd%
  14.   :top2
  15.   call :bcd >%temp%\bcd_temp.txt
  16.   cls
  17.   echo.
  18.   echo 删除 BCD 启动项目 %bcd%
  19.   echo.
  20.   type %temp%\bcd_temp.txt
  21.   echo.
  22.   set  p=
  23.   set /p p=请选择要删除的项目编号并回车确认(1.2.3.4...,x退出)_______
  24.   if /i *%p%*==*x* goto end1
  25.   for /L %%t in (1,1,%n%) do (if "%%t"=="%p%" goto del)
  26.   echo 录入错误,按任意键重新来过. & pause>nul
  27.   goto top2
  28.   :del
  29.   set /a p=%p%*3+1
  30.   for /f "skip=%p% tokens=1*" %%c in (%temp%\bcd_temp.txt) do (
  31.     echo 正在删除 %%d
  32.     bcdedit %bcd_p% /delete %%d
  33.     echo 项目删除指令运行完毕!按任意键继续....&& pause>nul
  34.     goto top2
  35.   )

  36. :error1
  37. echo 输入错误,按任意键重来! && pause >nul
  38. goto top

  39. :bcd
  40. set n=-1
  41. for /f "tokens=1*" %%c in ('bcdedit %bcd_p%  /v') do (
  42. set "id=%%d"
  43. if "!id:~0,1!"=="{"  set value=%%d
  44. if %%c*==description* (
  45.   set /a n=!n!+1
  46.   echo -- !n! -----------------------------------------------   
  47.   echo   ID: !value!
  48.   echo 说明: %%~d
  49. )
  50. )
  51.   echo ---End--------------------------------------------------
  52. exit /b
  53. :end1


复制代码
bcd_delete2.cmd
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. REM 根据BCD菜单项目名称 删除菜单项,项目名称不能包含 引号,& 。。。等特殊字符
  4. rem 第一参数:项目名称 应用双引号包裹
  5. rem 第二参数:可选,用来指明要操作的 bcd 路径,如果空,表示对当前bcd 进行操作。

  6. color 0a
  7. if *%1*==** goto error1
  8. set "menu_title=%~1"
  9. if not "%2"==""  set bcd_p=/Store %2
  10. set n=0
  11. echo 正在查找 名称为 “!menu_title!” 的启动项目并确定其标识符......
  12. for /f "tokens=1*" %%c in ('bcdedit !bcd_p! /v') do (
  13.   set "value=%%~d"
  14.   if /i "!value:~0,1!"=="{" set "id=!value!"
  15.   if /i "%%c"=="description"   (if "%%~d"=="!menu_title!" (
  16.           echo.& echo 找到项目,正在删除......
  17.           echo !id!
  18.           bcdedit %bcd_p% /delete !id!
  19.           set /a n=!n!+1
  20.   ))
  21. )
  22. echo.& echo 共处理 !n! 条
  23. goto end

  24. :error1
  25. echo 没有参数!请指明菜单项显示名称

  26. :end
  27. pause

复制代码


1.png (16.93 KB, 下载次数: 99)

1.png

sshot-1.png (9.83 KB, 下载次数: 105)

sshot-1.png

评分

参与人数 3无忧币 +15 收起 理由
879792799 + 5 赞一个!
freesoft00 + 5
我是来搞事的 + 5 很给力!

查看全部评分

2#
 楼主| 发表于 2018-3-8 00:01:37 | 只看该作者
第一个脚本有问题

点评

老大,有间题为什么不删除掉  详情 回复 发表于 2018-3-8 00:14
回复

使用道具 举报

3#
发表于 2018-3-8 00:14:06 | 只看该作者


老大,有问题为什么不删除掉

点评

源码己改正  详情 回复 发表于 2018-3-8 06:45
回复

使用道具 举报

4#
 楼主| 发表于 2018-3-8 06:45:32 来自手机 | 只看该作者
本帖最后由 dos时代菜鸟 于 2018-3-8 06:49 编辑
海市蜃楼 发表于 2018-3-8 00:14
老大,有问题为什么不删除掉


源码己改正,主要考虑非中文情况,所以搜索关建字改为其下方的英文字段。
回复

使用道具 举报

5#
发表于 2018-3-8 09:00:03 | 只看该作者
大神好手笔,学习收藏了,可以自己批处理删除启动项目了,谢谢
回复

使用道具 举报

6#
发表于 2018-3-8 10:47:08 | 只看该作者
好帖,学习收藏喔
请问有 批处理增加启动项目吗,谢谢

点评

有  详情 回复 发表于 2018-3-8 12:15
回复

使用道具 举报

7#
 楼主| 发表于 2018-3-8 12:15:53 | 只看该作者
本帖最后由 dos时代菜鸟 于 2018-3-8 12:21 编辑

本脚本用于把 一个 vhd 添加到启动项 附带4个参数
1、vhd 的 完整路径
2、扩展名,exe 或者 efi ,引导文件是 winload.exe 还是 winload.efi  主要针对 启动类型,如果省略 默认 Exe
3、启动项目的 显示名称 ,如果省略 默认 “Windows (vhd)”
4、bcd 的完整路径 如果省略,默认对当前 bcd 进行操作

  1. @echo off
  2. echo 向指定 BCD 中添加启动项目

  3. if "%1"=="" goto end

  4. set winload=exe
  5. if  not "%2"=="" set winload=%2

  6. set bcd_title="Windows (vhd)"
  7. if not "%3"=="" set bcd_title=%3

  8. rem set bcd_p=/Store %~d1\boot\bcd
  9. if not "%4"=="" (  set bcd_p=/Store %4&&  echo %4)

  10. echo 把 %1 安装进启动项
  11. ECHO     %bcd_title%
  12. echo     [%~d1]%~pnx1
  13. for /f "tokens=2" %%c in ('BCDEDIT %bcd_p% /CREATE /D %bcd_title% /application OSLOADER ') do set id=%%c
  14. bcdedit %bcd_p% /set %id% device   vhd=[%~d1]%~pnx1
  15. bcdedit %bcd_p% /set %id% OSdevice vhd=[%~d1]%~pnx1
  16. bcdedit %bcd_p% /set %id% path "\windows\system32\winload.%winload%"
  17. bcdedit %bcd_p% /set %id% systemroot \windows
  18. bcdedit %bcd_p% /set %id% locale zh-CN
  19. bcdedit %bcd_p% /set %id% detecthal on
  20. bcdedit %bcd_p% /set %id% pae ForceEnable
  21. bcdedit %bcd_p% /set %id% nx Optin
  22. bcdedit %bcd_p% /set %id% winpe No
  23. bcdedit %bcd_p% /displayorder %id% /addlast


  24. :end
复制代码
sh1688 发表于 2018-3-8 10:47
好帖,学习收藏喔
请问有 批处理增加启动项目吗,谢谢



点评

@echo off echo 向指定 BCD 中添加启动项目 if "%1"=="d:/vhd/win10.vhdx" goto end set winload=efi if not "%2"=="" set winload=%2 set bcd_title="Windows (vhd)" if not "%3"=="" set bcd_title  详情 回复 发表于 2022-1-17 13:45
厉害 楼主真好 谢谢  详情 回复 发表于 2018-3-10 09:17
回复

使用道具 举报

8#
 楼主| 发表于 2018-3-8 12:34:41 | 只看该作者
本帖最后由 dos时代菜鸟 于 2018-3-8 13:17 编辑

bcd_delete2.cmd
第 16行 ,%%d 改成 %%~d 就可以支持 带 引号包裹的 项目名称了,这个是 把 bcd 项目名称 的名称 去掉包裹引号 以后再 赋值参与搜索。


刚改进了一下,将删除命令放在循环里 运行,可以删除多条 相同名称的项目,以前那个 只能删除 最后一个 项目。
如图:


回复

使用道具 举报

9#
发表于 2018-3-10 09:17:42 | 只看该作者
dos时代菜鸟 发表于 2018-3-8 12:15
本脚本用于把 一个 vhd 添加到启动项 附带4个参数
1、vhd 的 完整路径
2、扩展名,exe 或者 efi ,引导文 ...

厉害 楼主真好 谢谢
回复

使用道具 举报

10#
发表于 2018-3-10 14:54:14 | 只看该作者
谢谢分享
回复

使用道具 举报

11#
 楼主| 发表于 2018-3-10 21:15:28 | 只看该作者
本帖最后由 dos时代菜鸟 于 2018-3-10 21:30 编辑

再次更新,发现 bcd  里面有的选项 是没有 device 设置的,所以 调整了一下 搜索关键字。
增加用户 选择 Bcd 功能。
回复

使用道具 举报

12#
发表于 2022-1-17 13:45:35 来自手机 | 只看该作者
dos时代菜鸟 发表于 2018-3-8 12:15
本脚本用于把 一个 vhd 添加到启动项 附带4个参数
1、vhd 的 完整路径
2、扩展名,exe 或者 efi ,引导文 ...

@echo off
echo 向指定 BCD 中添加启动项目

if "%1"=="d:/vhd/win10.vhdx" goto end

set winload=efi

if  not "%2"=="" set winload=%2

set bcd_title="Windows (vhd)"
if not "%3"=="" set bcd_title=%3

rem set bcd_p=/Store %~d1\boot\bcd
if not "%4"=="" (  set bcd_p=/Store %4&&  echo %4)

echo 把 %1 安装进启动项
ECHO     %bcd_title%
echo     [%~d1]%~pnx1
for /f "tokens=2" %%c in ('BCDEDIT %bcd_p% /CREATE /D %bcd_title% /application OSLOADER ') do set id=%%c
bcdedit %bcd_p% /set %id% device   vhd=[%~d1]%~pnx1
bcdedit %bcd_p% /set %id% OSdevice vhd=[%~d1]%~pnx1
bcdedit %bcd_p% /set %id% path "\windows\system32\winload.%winload%"
bcdedit %bcd_p% /set %id% systemroot \windows
bcdedit %bcd_p% /set %id% locale zh-CN
bcdedit %bcd_p% /set %id% detecthal on
bcdedit %bcd_p% /set %id% pae ForceEnable
bcdedit %bcd_p% /set %id% nx Optin
bcdedit %bcd_p% /set %id% winpe No
bcdedit %bcd_p% /displayorder %id% /addlast


:end
我添加vhd完整路径,为什么无法启动?帮我看一下是哪里错了,谢谢!

点评

建议挂载 VHD 成盘符后,用 bcdboot 向BCD中添加VHD盘符中的系统。  详情 回复 发表于 2022-1-17 20:51
回复

使用道具 举报

13#
 楼主| 发表于 2022-1-17 20:51:06 来自手机 | 只看该作者
qq328 发表于 2022-1-17 13:45
@echo off
echo 向指定 BCD 中添加启动项目


建议挂载 VHD 成盘符后,用 bcdboot 向BCD中添加VHD盘符中的系统。

点评

好的,谢谢!  详情 回复 发表于 2022-1-18 09:08
回复

使用道具 举报

14#
发表于 2022-1-18 09:08:50 来自手机 | 只看该作者
dos时代菜鸟 发表于 2022-1-17 20:51
建议挂载 VHD 成盘符后,用 bcdboot 向BCD中添加VHD盘符中的系统。

好的,谢谢!
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-4-19 21:39

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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