无忧启动论坛

标题: 问题已解决 [打印本页]

作者: moran    时间: 2017-10-28 17:03
标题: 问题已解决
本帖最后由 moran 于 2017-10-31 17:02 编辑

例如在BCD里添加了一个PE启动项,菜单名是固定的名称。

BCD里有几个启动项不固定,需要删除的启动项排在第几也是不固定的。
需要通过批处理删除那个启动项,请问如何静默获取那个启动项的GUID?以供批处理使用。
谢谢大家。
作者: nttwqz    时间: 2017-10-28 21:50
  1. @echo off

  2. rem 获取本机启动项的GUID,即displayorder列表

  3. set n=1
  4. setlocal enabledelayedexpansion
  5. bcdedit /enum {bootmgr} /v >%temp%\bootlist.txt
  6. rem 获取displayorder所在的行号
  7. for /f "tokens=1 delims=:" %%a in ('type "%temp%\bootlist.txt" ^| findstr /n "^displayorder"') do set /a skip=%%a-1
  8. rem 忽略displayorder之前的行从而节省时间
  9. for /f "skip=%skip% tokens=1,2" %%a in ('type "%temp%\bootlist.txt"') do (
  10.         if /i "%%a"=="displayorder" set boot-1=%%b
  11.         echo %%a | findstr "{.*}" >nul 2>nul && (
  12.                 set /a n+=1
  13.                 set boot-!n!=%%a
  14.         )
  15. )
  16. del /f /q "%temp%\bootlist.txt"
  17. for /l %%a in (1,1,!n!) do echo !boot-%%a!
  18. pause
复制代码

作者: moran    时间: 2017-10-29 00:18
nttwqz 发表于 2017-10-28 21:50

这个貌似不行,你这个会取出所有启动项的GUID,直接通过批处理怎么判断需要删除的是哪个呢?
作者: nttwqz    时间: 2017-10-29 00:32
moran 发表于 2017-10-29 00:18
这个貌似不行,你这个会取出所有启动项的GUID,直接通过批处理怎么判断需要删除的是哪个呢?

呃,这个,当然是继续判断了,你要删除的启动项里面总有一些参数是不变的吧?

比如device、description什么的,再使用上面的for、if接着判断不就出来了,上面就使用了这个方法。

我的思路
提取启动项列表>>分析各个启动项,提取符合条件的启动项>>删除!

但是,要是真的所有参数都变了,那我想,除了备份恢复之外,一时还难以想到什么好办法
作者: dgrand    时间: 2017-10-29 11:43
批处理还是比shell弱了很多。
作者: moran    时间: 2017-10-29 15:26
nttwqz 发表于 2017-10-29 00:32
呃,这个,当然是继续判断了,你要删除的启动项里面总有一些参数是不变的吧?

比如device、descriptio ...

你的思路我懂了,研究了一下,由于我对for命令非常不熟,还是没成功。
麻烦你能不能也写一个示例,非常感谢。
作者: nttwqz    时间: 2017-10-29 18:11
moran 发表于 2017-10-29 15:26
你的思路我懂了,研究了一下,由于我对for命令非常不熟,还是没成功。
麻烦你能不能也写一个示例,非常 ...

好吧,这个是简单的实现办法

  1. @echo off

  2. rem 获取本机启动项的GUID,即displayorder列表

  3. set n=1
  4. setlocal enabledelayedexpansion
  5. bcdedit /enum {bootmgr} /v >%temp%\bootlist.txt
  6. rem 获取displayorder所在的行号
  7. for /f "tokens=1 delims=:" %%a in ('type "%temp%\bootlist.txt" ^| findstr /n "^displayorder"') do set /a skip=%%a-1
  8. rem 忽略displayorder之前的行从而节省时间
  9. for /f "skip=%skip% tokens=1,2" %%a in ('type "%temp%\bootlist.txt"') do (
  10.         if /i "%%a"=="default" set "default=%%b"
  11.         if /i "%%a"=="displayorder" set boot-1=%%b
  12.         echo %%a | findstr "{.*}" >nul 2>nul && (
  13.                 set /a n+=1
  14.                 set boot-!n!=%%a
  15.         )
  16. )
  17. del /f /q "%temp%\bootlist.txt"
  18. :menu
  19. for /l %%a in (1,1,!n!) do (
  20.         echo; [%%a]        *****************************************************************
  21.         echo;
  22.         bcdedit /enum !boot-%%a! /v | findstr /r "!boot-%%a! device osdevice description"
  23.         echo;
  24. )
  25. echo;
  26. set /p input=请选择您要删除的启动项:
  27. cls & bcdedit /enum !boot-%input%! /v & echo;
  28. echo;你确定要删除上面的启动项吗? Y 继续
  29. set /p ok=
  30. if /i not ok==y goto menu
  31. bcdedit /delete !boot-%input%! /cleanup /f

  32. pause
复制代码

作者: moran    时间: 2017-10-29 23:05
nttwqz 发表于 2017-10-29 18:11
好吧,这个是简单的实现办法

好的,谢谢了。
我看看能不能改成自动选择的。




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