Powershell & bcdedit: определение разделов для восстановления

Я пытаюсь написать сценарий удаления / резервного копирования раздела OEM (который просто возвращает систему к устаревшей версии, не имеющей практического применения).

На многих системах используется DISKPART list partition возвращает больше 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

Это возвращает строку как:

[\Device\HarddiskVolume1]

где номер тома - это раздел для использования в Diskpart, (Оставшиеся разделы восстановления и разделы типа OEM могут быть зарезервированы).

Это правильная процедура для идентификации раздела WinRE?

Есть более прямой и / или лучший подход?

1 ответ

Помимо оптимизации строки выбора с помощью Lookbehind-RE
Я не вижу лучшего подхода к банкомату.

$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.

Другие вопросы по тегам