将bcdedit/firmware转数组的PowerShell脚本改写为Batch脚本求助
将PowerShell版固件启动项列表脚本改写为Batch脚本
原PowerShell脚本功能说明
该脚本通过bcdedit /firmware获取固件启动项,提取描述、标识符、设备、路径等关键信息并封装为自定义对象,支持列表/表格展示、指定条目提取等操作。
PowerShell脚本代码
function FWList { $FWStore = bcdedit /enum firmware $FWOS = ($FWStore | select-string identifier,device,path,description) -notmatch '{fwbootmgr}' for ( $n=0; $n -lt $FWOS.count; $n++ ) { if ( $FWOS[$n] -match 'identifier' ) { if ( $FWOS[$($n + 1 )] -match 'device' ) { [PsCustomObject]@{ des = $FWOS[$($n + 3)].line.TrimStart('description').Trim() id = $FWOS[$n].line.Split()[-1] path = $FWOS[$($n + 2)].line.Split()[-1] dev = $FWOS[$($n + 1)].line.Split()[-1] } } else { [PsCustomObject]@{ des = $FWOS[$($n + 1)].line.TrimStart('description').Trim() id = $FWOS[$n].line.Split()[-1] } } } } } # Example Usage FWList | Format-List #To show in List view FWList | Format-Table #To show in Table view (FWList)[1..3] | Foreach {$_.des} Pause
PowerShell脚本示例输出
执行FWList | Format-List的输出:
des : Windows Boot Manager id : {bootmgr} path : \EFI\Microsoft\Boot\bootmgfw.efi dev : partition=\Device\HarddiskVolume3 des : ATA HDD: ADATA SU650 id : {ed2a2e5c-bb68-11ee-89e6-806e6f6e6963}
Batch脚本改写实现
以下是完成后的Batch脚本,完全对齐原PowerShell脚本的功能,支持相同的输出格式和操作:
@echo off setlocal ENABLEDELAYEDEXPANSION :: 初始化条目计数器和临时缓存变量 set "itemCount=0" set "tempId=" set "tempDev=" set "tempPath=" set "tempDes=" :: 遍历过滤后的bcdedit输出,按键值对拆分处理 for /F "tokens=1,* delims=:" %%a in ('bcdedit /enum firmware ^| findstr /i "identifier description device path" ^| findstr /v "{fwbootmgr}"') do ( set "key=%%a" set "value=%%b" :: 移除值前面的空格 set "value=!value:~1!" :: 处理不同字段 if /I "!key!"=="identifier" ( :: 若不是第一个条目,先保存上一个完整条目 if not "!tempId!"=="" ( set "item[!itemCount!].id=!tempId!" set "item[!itemCount!].des=!tempDes!" if defined tempDev ( set "item[!itemCount!].dev=!tempDev!" set "item[!itemCount!].path=!tempPath!" ) set /a itemCount+=1 :: 重置临时变量 set "tempDev=" set "tempPath=" set "tempDes=" ) set "tempId=!value!" ) else if /I "!key!"=="device" ( set "tempDev=!value!" ) else if /I "!key!"=="path" ( set "tempPath=!value!" ) else if /I "!key!"=="description" ( set "tempDes=!value!" ) ) :: 保存最后一个条目 if not "!tempId!"=="" ( set "item[!itemCount!].id=!tempId!" set "item[!itemCount!].des=!tempDes!" if defined tempDev ( set "item[!itemCount!].dev=!tempDev!" set "item[!itemCount!].path=!tempPath!" ) set /a itemCount+=1 ) :: 示例1:列表形式展示所有条目 echo === 列表形式展示 === for /L %%i in (0,1,!itemCount!-1) do ( echo des : !item[%%i].des! echo id : !item[%%i].id! if defined item[%%i].dev ( echo dev : !item[%%i].dev! echo path: !item[%%i].path! ) echo. ) :: 示例2:表格形式展示所有条目 echo === 表格形式展示 === echo 描述^|标识符^|设备^|路径 echo ------------------------ for /L %%i in (0,1,!itemCount!-1) do ( set "line=!item[%%i].des!^|!item[%%i].id!" if defined item[%%i].dev ( set "line=!line!^|!item[%%i].dev!^|!item[%%i].path!" ) else ( set "line=!line!^|^|" ) echo !line! ) :: 示例3:获取第2到第4个条目的描述(索引从0开始,对应原PowerShell的[1..3]) echo === 第2到第4个条目描述 === for /L %%i in (1,1,3) do ( if %%i lss !itemCount! ( echo !item[%%i].des! ) ) pause endlocal
Batch脚本核心逻辑说明
- 用
tokens=1,* delims=:拆分bcdedit输出的键值对,适配其格式 - 通过临时变量缓存每个启动项的字段,遇到新的
identifier时完成上一个条目的存储 - 兼容两种启动项格式(带device/path和不带的情况)
- 实现了与原PowerShell脚本一致的列表展示、表格展示、指定范围条目提取功能
内容的提问来源于stack exchange,提问作者Mr.Key7
相关产品推荐
相关产品推荐

