dos时代菜鸟 发表于 2018-3-7 23:53:51

删除 bcd 中指定项目的 脚本

本帖最后由 dos时代菜鸟 于 2018-3-10 21:14 编辑

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

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

:top
if not *%bcd%*==** set bcd_p=/store %bcd%
:top2
call :bcd >%temp%\bcd_temp.txt
cls
echo.
echo 删除 BCD 启动项目 %bcd%
echo.
type %temp%\bcd_temp.txt
echo.
setp=
set /p p=请选择要删除的项目编号并回车确认(1.2.3.4...,x退出)_______
if /i *%p%*==*x* goto end1
for /L %%t in (1,1,%n%) do (if "%%t"=="%p%" goto del)
echo 录入错误,按任意键重新来过. & pause>nul
goto top2
:del
set /a p=%p%*3+1
for /f "skip=%p% tokens=1*" %%c in (%temp%\bcd_temp.txt) do (
    echo 正在删除 %%d
    bcdedit %bcd_p% /delete %%d
    echo 项目删除指令运行完毕!按任意键继续....&& pause>nul
    goto top2
)

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

:bcd
set n=-1
for /f "tokens=1*" %%c in ('bcdedit %bcd_p%/v') do (
set "id=%%d"
if "!id:~0,1!"=="{"set value=%%d
if %%c*==description* (
set /a n=!n!+1
echo -- !n! -----------------------------------------------   
echo   ID: !value!
echo 说明: %%~d
)
)
echo ---End--------------------------------------------------
exit /b
:end1


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

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

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

:end
pause



dos时代菜鸟 发表于 2018-3-8 00:01:37

第一个脚本有问题

海市蜃楼 发表于 2018-3-8 00:14:06

dos时代菜鸟 发表于 2018-3-8 00:01
第一个脚本有问题

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

dos时代菜鸟 发表于 2018-3-8 06:45:32

本帖最后由 dos时代菜鸟 于 2018-3-8 06:49 编辑

海市蜃楼 发表于 2018-3-8 00:14
老大,有问题为什么不删除掉

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

l3429900 发表于 2018-3-8 09:00:03

大神好手笔,学习收藏了,可以自己批处理删除启动项目了,谢谢

sh1688 发表于 2018-3-8 10:47:08

好帖,学习收藏喔
请问有 批处理增加启动项目吗,谢谢

dos时代菜鸟 发表于 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 进行操作

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

if "%1"=="" goto end

set winload=exe
ifnot "%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

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


dos时代菜鸟 发表于 2018-3-8 12:34:41

本帖最后由 dos时代菜鸟 于 2018-3-8 13:17 编辑

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


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


sh1688 发表于 2018-3-10 09:17:42

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

厉害 楼主真好 谢谢

zqjiang 发表于 2018-3-10 14:54:14

谢谢分享

dos时代菜鸟 发表于 2018-3-10 21:15:28

本帖最后由 dos时代菜鸟 于 2018-3-10 21:30 编辑

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

qq328 发表于 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

ifnot "%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完整路径,为什么无法启动?帮我看一下是哪里错了,谢谢!

dos时代菜鸟 发表于 2022-1-17 20:51:06

qq328 发表于 2022-1-17 13:45
@echo off
echo 向指定 BCD 中添加启动项目



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

qq328 发表于 2022-1-18 09:08:50

dos时代菜鸟 发表于 2022-1-17 20:51
建议挂载 VHD 成盘符后,用 bcdboot 向BCD中添加VHD盘符中的系统。

好的,谢谢!
页: [1]
查看完整版本: 删除 bcd 中指定项目的 脚本