Программно перезагрузить компьютер и загрузиться на флешку

496
GrumpyCrouton

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

Я создал небольшой скрипт, который автоматически перезагрузит компьютер в последовательность восстановления (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 устройства в производственной среде.

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

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

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

4

1 ответ на вопрос

3
qasdfdsaq

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

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

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

bcdedit /copy /d "My Boot Entry Description" 

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

The entry was successfully copied to . 

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

bcdedit /set device partition=D: bcdedit /set osdevice partition=D: bcdedit /set path \Location\Of\Your\Bootloader.efi 

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

bcdedit /bootsequence 

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

"_boot на внешний диск для" сбора информации об оборудовании "_" Извините, недоразумение. Часть программы, которая собирает информацию об оборудовании, отделена от перезапуска. В основном, процесс перезагружается, компьютер восстанавливается с помощью восстановления, затем, пока на языковом экране тестер запускает программу из командной строки (которая собирает оборудование, выполняет некоторые тесты и отображает UPC и серийный номер для проверки тестером), затем они нажимают кнопку. перезагрузить компьютер на их флешку, которая называется программой Active Boot и используется для очистки свободного пространства. Спасибо за ответ! GrumpyCrouton 6 лет назад 0
Есть ли способ сделать это скорее временным решением? Например, будет ли это загружаться только один раз, а затем вернуться к настройкам по умолчанию? GrumpyCrouton 6 лет назад 0
Это на самом деле не похоже на работу. Каждый раз, когда я использую это, при запуске я получаю «Запуск автоматического восстановления», и он просто переходит в среду устранения неполадок, как будто была проблема. GrumpyCrouton 6 лет назад 0
@GrumpyCrouton: Единственный способ заставить его загрузиться только с новой опцией один раз, а затем вернуться к предыдущему значению по умолчанию, - это заставить систему, которую вы загружаете, изменить ее обратно. Что касается того, почему это не работает для вас, пожалуйста, добавьте раздел «Обновление» внизу вашего вопроса, показывающий, какова ваша текущая проблема с использованием этого предложенного ответа, или задайте новый вопрос. 3D1T0R 6 лет назад 0
@ 3D1T0R [BCD-запись только для winpe запускает подготовку автоматического восстановления] (// stackoverflow.com/q/50629668) GrumpyCrouton 6 лет назад 0