予定や保存確認を表示したい場合は、メッセージ表示とPCを終了する操作を分けます。
本稿のPowerShellは表示だけで、シャットダウンや再起動は実行しません。
サインイン時と終了前の表示を分ける
| 目的 | 操作 | 適用範囲 |
|---|---|---|
| サインイン後の予定 | ログオン時のタスク | 対話中の本人に表示 |
| 作業終了前の保存確認 | メモを手動実行 | 閉じた後に電源メニューへ |
| 終了する全場面を監視 | この例の対象外 | 更新・別アプリの終了は捕捉しない |
終了前の例は手動で開くメモです。
Windowsの電源ボタンや更新による終了を自動で横取りし、保存を保証する仕組みではありません。
終了処理を含まないPowerShellの作業メモ
練習ZIPのReminder.ps1を新しいフォルダーに置きます。
Windows PowerShell 5.1で日本語を読み込むため、配布ファイルはUTF-8のBOM付きで保存しています。
param(
[ValidateSet('SignIn','BeforeExit')]
[string]$Mode = 'SignIn',
[switch]$Preview
)
$messages = @{
SignIn = '今日の予定を確認してください。'
BeforeExit = '作業を保存し、保存先を確認してからWindowsの電源メニューで終了してください。'
}
$message = $messages[$Mode]
if ($Preview) {
[PSCustomObject]@{ Mode = $Mode; Message = $message; ShutdownExecuted = $false }
return
}
Add-Type -AssemblyName PresentationFramework
[void][System.Windows.MessageBox]::Show($message, '作業メモ')
# メッセージ表示だけ。シャットダウン・再起動は実行しない。
最初はコードを通常のPowerShell入力として実行し、Previewを指定してメッセージの内容だけを確認します。
SignInなら予定確認、BeforeExitなら保存確認となり、ShutdownExecutedはFalseです。
ファイル実行が許可されている環境では、powershell.exe -NoProfile -STA -File "C:\cgm-startup-practice\Reminder.ps1" -Mode BeforeExit -Previewで内容を確認できます。
実際の展開先へパスを置き換えてください。
Previewを外すと、メッセージを表示します。
今回のPCではファイル実行がポリシーで止まるため、同じコードの通常入力によるPreviewだけを実行確認し、表示画面は未確認です。
サインイン時のタスクを設定する場合
まず同じユーザーでメッセージ表示を手動確認します。
PowerShellが実行ポリシーで止まる場合は、この手順を続けず管理者へ確認し、Bypassなどで回避しません。
タスクスケジューラで「タスクの作成」を選び、名前をCGM作業メモなどにします。
全般で本人を指定し、「ユーザーがログオンしているときのみ実行する」を選びます。
トリガーは「ログオン時」で本人だけを対象にします。
操作のプログラムにはWindows PowerShellの実在するpowershell.exeを選び、引数は次の形にします。
-NoProfile -STA -File "C:\cgm-startup-practice\Reminder.ps1" -Mode SignInのパスを自分の展開先に置き換えます。
最上位の特権やシステムユーザーは使わず、タスクの「実行」で本人の画面へ出ることを先に確認します。
タスクが成功扱いでも、別セッションで起動すれば本人に画面が見えない場合があります。
実際のログオン、手動実行、タスク履歴をそれぞれ確認し、この記事の検証済み結果とは区別してください。
shutdownの待ち時間は保存確認にならない
以前の例はshutdownで60秒待ち、保存を促すメッセージを表示していました。
Microsoftの仕様では、待ち時間が0より大きいとアプリの強制終了が暗黙に有効になります。
したがって、待ち時間やコメントだけで未保存データの保護はできません。
本稿では終了予約を作るコマンドを練習例にせず、手動の保存確認と電源メニューを分けています。
既に終了予約を開始した場合は、待ち時間内に別のコマンドプロンプトでshutdown /aを実行すると取り消せます。
予約がない場合や時間切れでは取り消せないため、確認用として終了予約を作らないでください。
表示を止める・元へ戻す
メッセージを閉じれば、このスクリプト自体は終了します。
作成したタスクを止める場合は、その名前を確認して無効化し、既存の別タスクは変更しません。
使う前のXMLエクスポートや設定記録がある場合は、それと照合して戻します。
この作業ではタスク作成・ログオン・シャットダウンを実施しておらず、それらの動作は未検証です。
常駐アプリの見直しはNVIDIAの自動起動の記事、キーから練習処理を呼ぶ場合はAutoHotkey v2の記事を参照してください。
関連するWindows操作と従来の参考資料
以前の関連記事と外部コードの参照先です。
旧コードと本稿の練習ファイルは内容が異なるため、今回の手順では本稿のファイルを使います。





