You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 22:25:58