Powershell 和 bcdedit:识别恢复分区
Powershell & bcdedit: Identify recovery partitions
我正在尝试编写 OEM 分区的 elimination/backup 脚本(这只会将系统恢复到没有实际用途的过时版本)。
在许多系统上,使用 DISKPART list partition
returns 更多 recovery
类型的分区:一个是官方 Microsoft Recovery Tools 分区 (WinRE),其他来自 OEM。
第一步是安全地识别 WinRE 分区的位置。我没有在 bcdedit
或 PS 中找到任何直接的方法,除了:
$renv=(bcdedit /enum "{default}" | Select-String "^recoverysequence" | Out-String | Select-String "{.+}").Matches.Value
(bcdedit /enum $renv | Select-String "^device" | Out-String | Select-String "\[.+\]").Matches.Value
这个returns一个字符串,如:
[\Device\HarddiskVolume1]
其中卷号是要在 Diskpart
中使用的分区。 (可以备份剩余的恢复分区和OEM类型的分区)。
这是识别 WinRE 分区的正确过程吗?
还有更直接的 and/or 更好的方法吗?
除了使用 Lookbehind-RE
简化 Select-String
我没有看到更好的方法 ATM。
$renv=(bcdedit /enum "{default}" | Select-String "(?<=^recoverysequence\s+)({.+})").Matches.Value
(bcdedit /enum $renv | Select-String "(?<=^device.+)\[.+\]").Matches.Value
[\Device\HarddiskVolume5]
有一个名为 ReagentC 的命令行工具,它在路径中,因此您可以从任何管理命令提示符调用它。
reagentc /info
...将产生如下输出:
Windows RE status: Enabled
Windows RE location: \?\GLOBALROOT\device\harddisk0\partition4\Recovery\WindowsRE
Boot Configuration Data (BCD) identifier: 496c58c4-71cb-11e9-af8f-001c42903d2e
Recovery image location:
Recovery image index: 0
Custom image location:
Custom image index: 0
此外,如果您正在编写代码来完成这项工作,您可以通过调用 winapi 函数来完成这项工作来发现恢复分区。调用起来非常复杂 api...但就其价值而言,它是 DeviceIOControl
,控制代码为 IOCTL_DISK_GET_PARTITION_INFO_EX
。如果您不使用 C 或某些定义联合的语言,这将是一件痛苦的事情。您得到的结构因磁盘是 GPT 还是 MBR 格式而异。
如果磁盘是 MBR,则返回的分区类型将为 0x27,如果是 GPT 驱动器,则分区类型将为 guid:de94bba4-06d1-4d40-a16a-bfd50179d6ac
.
我正在尝试编写 OEM 分区的 elimination/backup 脚本(这只会将系统恢复到没有实际用途的过时版本)。
在许多系统上,使用 DISKPART list partition
returns 更多 recovery
类型的分区:一个是官方 Microsoft Recovery Tools 分区 (WinRE),其他来自 OEM。
第一步是安全地识别 WinRE 分区的位置。我没有在 bcdedit
或 PS 中找到任何直接的方法,除了:
$renv=(bcdedit /enum "{default}" | Select-String "^recoverysequence" | Out-String | Select-String "{.+}").Matches.Value
(bcdedit /enum $renv | Select-String "^device" | Out-String | Select-String "\[.+\]").Matches.Value
这个returns一个字符串,如:
[\Device\HarddiskVolume1]
其中卷号是要在 Diskpart
中使用的分区。 (可以备份剩余的恢复分区和OEM类型的分区)。
这是识别 WinRE 分区的正确过程吗?
还有更直接的 and/or 更好的方法吗?
除了使用 Lookbehind-RE
简化 Select-String
我没有看到更好的方法 ATM。
$renv=(bcdedit /enum "{default}" | Select-String "(?<=^recoverysequence\s+)({.+})").Matches.Value
(bcdedit /enum $renv | Select-String "(?<=^device.+)\[.+\]").Matches.Value
[\Device\HarddiskVolume5]
有一个名为 ReagentC 的命令行工具,它在路径中,因此您可以从任何管理命令提示符调用它。
reagentc /info
...将产生如下输出:
Windows RE status: Enabled
Windows RE location: \?\GLOBALROOT\device\harddisk0\partition4\Recovery\WindowsRE
Boot Configuration Data (BCD) identifier: 496c58c4-71cb-11e9-af8f-001c42903d2e
Recovery image location:
Recovery image index: 0
Custom image location:
Custom image index: 0
此外,如果您正在编写代码来完成这项工作,您可以通过调用 winapi 函数来完成这项工作来发现恢复分区。调用起来非常复杂 api...但就其价值而言,它是 DeviceIOControl
,控制代码为 IOCTL_DISK_GET_PARTITION_INFO_EX
。如果您不使用 C 或某些定义联合的语言,这将是一件痛苦的事情。您得到的结构因磁盘是 GPT 还是 MBR 格式而异。
如果磁盘是 MBR,则返回的分区类型将为 0x27,如果是 GPT 驱动器,则分区类型将为 guid:de94bba4-06d1-4d40-a16a-bfd50179d6ac
.