4

Первоначально я разместил это в Переполнении стека, но мне сказали, что это может быть лучшее место для размещения этого вопроса, так что здесь;

Я создал небольшой скрипт, который автоматически перезагрузит компьютер в последовательность восстановления (Windows Recovery Environment). Вот мой код:

$testpath = test-path "bcdedit.txt"
if ($testpath -eq $true){
    Remove-item "bcdedit.txt"
}
bcdedit | Out-File "bcdedit.txt"
foreach($line in Get-Content .\bcdedit.txt) {
    if($line -match $regex){
        if($line -like 'recoverysequence*') {
            $variable = "{" + $line.Split('{')[-1]
        }
    }
}
bcdedit /bootsequence $variable
Remove-item "bcdedit.txt"
shutdown /r /t 1

Этот скрипт Powershell запускается из моего приложения Electron (фреймворк на основе Node.js). Это приложение работает на сотнях различных моделей компьютеров в день, собирает информацию об их оборудовании и сравнивает их с базой данных для получения UPC устройства в производственной среде.

Однако у меня есть эта функция, потому что я не мог найти способ сделать то, что я действительно хотел сделать. Я хотел, чтобы этот скрипт действительно перезагрузил компьютер и загрузился с USB-накопителя.EFI файл Перезагрузка в Windows Recovery Environment была решением, которое я реализовал, потому что оно представляет собой кнопку для загрузки на USB-накопитель. Я пишу здесь, потому что я действительно хотел бы исключить этот шаг и просто загрузиться прямо на флешку. Флэш-накопитель USB, на котором запущена программа, также будет содержать загрузочный.EFI файл

Теперь вопрос: как я могу написать код (в PowerShell, Electron или Node.js), который перезагружает компьютер и заставляет его загружаться с флэш-накопителя USB?

Я пытался выяснить, как сделать это с помощью bcdedit , и не могу ничего найти, и я действительно не знаю других поисковых запросов, чтобы попытаться найти то, что мне нужно, я в недоумении.

1 ответ1

3

Игнорирование того факта, что это звучит как проблема XY, поскольку я не вижу объяснения необходимости загрузки с внешнего диска для "сбора информации об оборудовании", когда у вас уже есть административный доступ к работающей ОС ...

Windows довольно легко загрузить на подключенный USB-накопитель. Вы создаете загрузочную запись для диска с помощью bcdedit create , а затем указываете Windows загрузиться на него. Создание загрузочных записей документировано Microsoft здесь

Согласно документации, может быть проще скопировать существующую запись:

bcdedit /copy {current} /d "My Boot Entry Description"

bcdedit вернет GUID новой загрузочной записи, которую вам нужно будет извлечь:

The entry was successfully copied to {some-autogenerated-guid-here}.

Затем установите параметры новой записи, чтобы они указывали на ваше USB-устройство. Минимальные свойства, которые вам нужно изменить, это устройство, osdevice и путь. В зависимости от того, что вы загружаете, вам может потребоваться изменить другие значения - просто посмотрите на вывод bcdedit для вашего существующего загрузчика Windows и / или загрузчиков PE / PXE в качестве примеров.

bcdedit /set {your-new-boot-entry-guid} device partition=D:
bcdedit /set {your-new-boot-entry-guid} osdevice partition=D:
bcdedit /set {your-new-boot-entry-guid} path \Location\Of\Your\Bootloader.efi

Затем скажите Windows, чтобы он загрузился, как вы уже делаете:

bcdedit /bootsequence {your-new-boot-entry-guid}

Очевидно, замените My Boot Entry Description чем-то полезным, возможно, уникальным идентификатором, который поможет вам найти в будущем запись для повторного использования или удаления, если вы запускаете указанный скрипт каждый день. Замените D: любой буквой диска устройства USB, которое вы пытаетесь загрузить; если вы делаете это в разнородных системах, возможно, вам придется определить это программно, так как буквы дисков будут различаться в зависимости от системы. И замените \Location\Of\Your\Bootloader.efi на, ну, относительный путь.Файл EFI, который вы пытаетесь загрузить.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .