DISM実行中にスリープやWindows Updateによる再起動をしないようにLinqPadでプロセス監視
で書いたように、LinqPadでAPIを呼び出すと、LinqPadを終了するまで、電源要求を継続することは示せた。
しかし、元々はDismコマンドを実行中だけ電源要求したかったので、目的は達成できていない。
LinqPadのサンプルにWindowを表示して非同期で処理をするサンプルがあったので、System.Diagnostics.Processクラスで実行ファイルリストを取得してDismが起動していたら、起動中に電源要求を行うスクリプトを書いてみた。 (Free版で実行できるため、開発環境のインストールは不要です)
LinqPad Script to avoid the sleep mode on running …
変更したのは、
- Task.Delay()にCancellationTokenSource.Tokenを渡して、待機中にCancellationTokenSource.Cancel()が呼ばれたら例外が発生して中断するようにする
- プロセスリストの処理中にCancellationTokenSource.Cancel()が呼ばれたら例外が発生させるように、CancellationTokenSource.Token.ThrowIfCancellationRequested()を呼び出す
使い方は簡単で、
- Dismコマンドを実行する
- LinqPadを管理者モードで起動して、Startボタンを押すとDismコマンドの監視を開始
- Dismコマンドが起動していなかったらすぐに監視を終了する
- Cancelボタンを押したら監視を終了する
例えば、以下のコマンドだと、ダウンロードしたWindows.isoをEドライブにマウントした後に、Windows 10 Home (Index:2, Proなら1を指定)をwimに切り出す。(Proなら1を指定)
D:\1607>Dism /Export-Image /SourceImageFile:E:\sources\install.esd /SourceIndex:2 /DestinationImageFile:install2.wim /Compress:max /CheckIntegrity 展開イメージのサービスと管理ツール バージョン: 10.0.14393.0 イメージをエクスポートしています [===========================64.0%===== ]
電源要求の確認は、管理者モードのコマンドプロンプトでpowercfg /requestsを実行すると行える。
C:\WINDOWS\system32>powercfg /requests DISPLAY: [PROCESS] \Device\HarddiskVolume3\Users\xxxx\AppData\Local\LINQPad\ProcessServer5X86B\LINQPad.UserQuery.exe SYSTEM: [DRIVER] \FileSystem\srvnet アクティブなリモート クライアントが、このコンピューターに最近要求を送信しました。 [PROCESS] \Device\HarddiskVolume3\Users\xxxx\AppData\Local\LINQPad\ProcessServer5X86B\LINQPad.UserQuery.exe AWAYMODE: [PROCESS] \Device\HarddiskVolume3\Users\xxxx\AppData\Local\LINQPad\ProcessServer5X86B\LINQPad.UserQuery.exe 実行: なし。 PERFBOOST: なし。 ACTIVELOCKSCREEN: なし。
Dismコマンドの実行が終了したら監視も終了する。
D:\1607>Dism /Export-Image /SourceImageFile:E:\sources\install.esd /SourceIndex:2 /DestinationImageFile:install2.wim /Compress:max /CheckIntegrity 展開イメージのサービスと管理ツール バージョン: 10.0.14393.0 イメージをエクスポートしています [==========================100.0%==========================] 操作は正常に完了しました。
C:\WINDOWS\system32>powercfg /requests DISPLAY: なし。 SYSTEM: [DRIVER] \FileSystem\srvnet アクティブなリモート クライアントが、このコンピューターに最近要求を送信しました。 AWAYMODE: なし。 実行: なし。 PERFBOOST: なし。 ACTIVELOCKSCREEN: なし。
ほんとは、TextBoxで監視対象のプロセス名を変更したかったのだが、IMEで変換した文字じゃないとなぜか入力できなかったので、dism固定にしてしまった。