web-dev-qa-db-ja.com

プログラムでコンピュータを再起動し、フラッシュドライブを起動します

私はもともとStackOverflowに投稿しましたが、この質問を投稿するのに適した場所である可能性があると言われました。

コンピューターを自動的に再起動して回復シーケンス(Windows回復環境)にする小さなスクリプトを作成しました。これが私のコードです:

$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ベースのフレームワーク)アプリから実行されます。このアプリは、1日あたり数百の異なるコンピューターモデルで実行され、ハードウェア情報を収集してデータベースと比較し、実稼働環境でユニットのUPCを取得します。

しかし、本当にやりたいことをする方法がわからなかったので、この機能があります。このスクリプトで実際にコンピューターを再起動する必要がありましたそしてUSBドライブの.EFIファイルで起動します。 Windows回復環境への再起動は、USBフラッシュドライブを起動するためのボタンが表示されるため、私が実装した回避策でした。この手順を本当に削除して、USBフラッシュドライブを直接起動したいので、ここに投稿します。プログラムを実行しているUSBフラッシュドライブには、起動可能な.EFIファイルも含まれています。

ここで問題となるのは、コンピューターを再起動してUSBフラッシュドライブから起動するコード(PowerShell、Electron、またはNode.js)を作成するにはどうすればよいですか?

bcdeditでこれを行う方法を調べてみましたが、何も見つかりませんでした。必要なものを見つけるための他の検索用語が本当にわからないので、ここで途方に暮れています。

4
GrumpyCrouton

実行中のOSへの管理アクセス権がすでにある場合に「ハードウェア情報を収集」するために外部ドライブを起動する必要があるという説明がないため、これがXYの問題のように聞こえるという事実を無視します。

プラグインされたUSBドライブでWindowsを起動するのは非常に簡単です。 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、およびパスです。起動する内容によっては、他の値を変更する必要がある場合があります。例として、既存のWindowsローダーやPE/PXEローダーのbcdedit出力を確認してください。

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ファイルの相対パスに置き換えます。

4
qasdfdsaq