我的方法看起来有点像这样:
(bcdedit /enum | Out-String) -split '(?<=\r\n)\r\n' | ForEach-Object {
$name, $data = $_ -split '\r\n---+\r\n'
$props = [ordered]@{
'name' = $name.Trim()
}
$data | Select-String '(?m)^(\S+)\s\s+(.*)' -AllMatches |
Select-Object -Expand Matches |
ForEach-Object { $props[$_.Groups[1].Value] = $_.Groups[2].Value.Trim() }
[PSCustomObject]$props
}
上面的代码基本上bcdedit
像其他答案一样将输出合并为单个字符串,然后将该字符串拆分为引导配置数据块。然后再次拆分这些块中的每一个,以将标题与实际数据分开。标题作为引导配置部分的名称添加到哈希表中,然后使用键/值对的正则表达式解析数据块。这些被附加到哈希表中,最终转换为自定义对象。
由于ordered
和PSCustomObject
类型加速器,代码至少需要 PowerShell v3。
当然,您可以对上面的基本示例代码进行各种优化。例如,不同的引导配置部分可能具有不同的属性。引导管理器部分具有类似toolsdisplayorder
和timeout
不存在于引导加载器部分中的属性,并且引导加载器部分具有类似osdevice
和systemroot
不存在于引导管理器部分中的属性。如果您想要所有生成的对象的一组一致的属性,您可以通过管道将它们Select-Object
与您希望对象具有的属性列表一起传递,例如:
... | Select-Object 'name', 'identifier', 'default', 'osdevice' 'systemroot'
列表中不存在的属性将从对象中删除,而对象中不存在的属性将添加一个空值。
此外,您可以将它们转换为更合适的类型,或者只是修改值,例如从字符串中删除大括号,而不是将所有值创建为字符串。
... | ForEach-Object {
$key = $_.Groups[1].Value
$val = $_.Groups[2].Value.Trim()
$val = $val -replace '^\{(.*)\}$', '$1'
if ($val -match '^[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}$') {
$val = [guid]$val
} elseif ($val -eq 'yes' -or $val -eq 'true') {
$val = $true
} elseif ($val -eq 'no' -or $val -eq 'false') {
$val = $false
} elseif ($key -eq 'locale') {
$val = [Globalization.CultureInfo]$val
}
$props[$key] = $val
}