予定や保存確認を表示したい場合は、メッセージ表示とPCを終了する操作を分けます。
本稿のPowerShellは表示だけで、シャットダウンや再起動は実行しません。
メッセージを表示するタイミングと準備
表示の確認からタスク登録へ進む手順です。
お使いのWindowsのエディションや管理者の設定によって、使える方法が異なることがあります。
- まず、表示したいタイミングを決める。サインイン後に予定を出したいのか、終了前に保存確認を出したいのかで、使う方法が変わる。
- 練習ZIPのReminder.ps1を新しいフォルダーに置き、同じユーザーでメッセージの表示を手動で確認する。
- サインイン後に表示する場合は、タスクスケジューラで「ログオン時」のタスクを作り、本人の画面に出ることを「実行」で先に確認する。
- PowerShellが実行ポリシーで止まる場合は、手順を続けず、管理者に確認する。Bypassなどで回避しない。
- 終了前の確認には、手動で開く「終了前チェック」のショートカットを使う。シャットダウンスクリプトは本人への保存確認には適さない。
- 不要になったときの、表示の止め方と元へ戻し方を、先に確認しておく。
手動のショートカットはグループポリシーエディターを使いません。
Homeを含む各エディションでの実表示は未検証です。
サインイン時と終了前の表示を分ける
| 目的 | 操作 | 適用範囲 |
|---|---|---|
| サインイン後の予定 | ログオン時のタスク | 対話中の本人に表示 |
| 作業終了前の保存確認 | メモを手動実行 | 閉じた後に電源メニューへ |
| 終了する全場面を監視 | この例の対象外 | 更新・別アプリの終了は捕捉しない |
終了前の例は手動で開くメモです。
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を外すと、メッセージを表示します。
本記事で実際に実行して確認したのは、同じコードを PowerShell の画面に直接入力した -Preview の動作までです。
検証に使った PC ではファイル(ps1)の実行が実行ポリシーで止まるため、タスクスケジューラからの登録・サインイン時の実際のポップアップ表示は確認できていません。
2026年10月24日の再確認も、本文・配布スクリプト・公式仕様の照合であり、ログオン時の実表示は未検証です。
お使いの PC でも ps1 の実行が止まる場合は、次の順に切り分けてください。
実行ポリシーの変更は PC の管理方針に関わるため、会社の端末では管理者に確認してから行ってください。
- まず
Get-ExecutionPolicy -Listとエラー全文を確認する。管理された端末では、スクリプトを直接貼り付けて回避せず管理者へ相談する - 直接入力したコードが動いた場合も、ファイルの実行許可・署名・文字コード・引数・実行ユーザーの違いを分けて調べる。原因を一つに断定しない
- 実行が許可された環境でのみ、まず
-Previewで内容を確認し、続いて表示を試す
サインイン時のタスクを設定する場合
まず同じユーザーでメッセージ表示を手動確認します。
PowerShellが実行ポリシーで止まる場合は、この手順を続けず管理者へ確認し、Bypassなどで回避しません。
タスクスケジューラで「タスクの作成」を選び、名前をCGM作業メモなどにします。
全般で本人を指定し、「ユーザーがログオンしているときのみ実行する」を選びます。
トリガーは「ログオン時」で本人だけを対象にします。
操作のプログラムにはWindows PowerShellの実在するpowershell.exeを選び、引数は次の形にします。
-NoProfile -STA -File "C:\cgm-startup-practice\Reminder.ps1" -Mode SignInのパスを自分の展開先に置き換えます。
最上位の特権やシステムユーザーは使わず、タスクの「実行」で本人の画面へ出ることを先に確認します。
タスクが成功扱いでも、別セッションで起動すれば本人に画面が見えない場合があります。
実際のログオン、手動実行、タスク履歴をそれぞれ確認し、この記事の検証済み結果とは区別してください。
黒いコンソールを出さないための引数
タスクスケジューラの[操作]で powershell.exe を呼ぶとき、引数の付け方で表示の挙動が変わります。
Microsoft のドキュメントに記載されているパラメーターは次のとおりです(about_PowerShell_exe)。
| 引数 | 公式ドキュメントの説明 | この用途での狙い |
|---|---|---|
-WindowStyle Hidden | 「セッションのウィンドウ スタイルを設定します。有効な値は、Normal、Minimized、Maximized、および Hidden です。」 | PowerShell 自体のウィンドウを隠す |
-File <パス> | スクリプトファイルを実行する。後ろにはファイルパスと、そのスクリプトに渡す引数を指定する | PowerShell本体のオプションは前に置く。-Mode BeforeExit などスクリプト用の引数はパスの後ろに置く |
-NoProfile | 「PowerShell プロファイルを読み込みません。」 | 起動を軽くし、プロファイルの影響を受けない |
-Sta | 「シングルスレッド アパートメントを使用して、PowerShell を起動します。」(Windows PowerShell 3.0 以降は既定) | ダイアログ表示の前提をそろえる |
-ExecutionPolicy <値> | 「現在のセッションの既定の実行ポリシーを設定し、$Env:PSExecutionPolicyPreference 環境変数に保存します。このパラメーターは、レジストリに設定されている PowerShell 実行ポリシーを変更しません。」 | 本記事の実行例では指定しない。組織のポリシーを無断で変更しない |
タスクスケジューラの[操作]欄の書き方は次のようになります。
- プログラム/スクリプト:
powershell.exe - 引数の追加:
-NoProfile -WindowStyle Hidden -Sta -File "C:\Scripts\Reminder.ps1"
-File より後ろに書いた値はスクリプトへの引数として解釈されるため、-WindowStyle Hidden は -File より前に置きます。
順番を逆にすると、引数として渡ってしまい効きません。
あわせて、タスクのプロパティ側も確認します。
- [全般]タブの「ユーザーがログオンしているときのみ実行する」を選ぶ(ダイアログを画面に出すため)
- 「最上位の特権で実行する」は、必要がなければオフのままにする
- [条件]タブの電源関連の条件は、ノートPCで動かないときの確認先になる
実行ポリシーでps1が止まる場合は、エラーと設定を記録して管理者へ確認してください。
直接入力で動いたことだけでは、ファイル実行やタスク登録の許可・動作を確認したことにはなりません。
shutdownの待ち時間は保存確認にならない
以前の例はshutdownで60秒待ち、保存を促すメッセージを表示していました。
Microsoftの仕様では、待ち時間が0より大きいとアプリの強制終了が暗黙に有効になります。
したがって、待ち時間やコメントだけで未保存データの保護はできません。
本稿では終了予約を作るコマンドを練習例にせず、手動の保存確認と電源メニューを分けています。
既に終了予約を開始した場合は、待ち時間内に別のコマンドプロンプトでshutdown /aを実行すると取り消せます。
予約がない場合や時間切れでは取り消せないため、確認用として終了予約を作らないでください。
保存確認にシャットダウンスクリプトを使わない理由
Microsoft のドキュメントでは、ローカルグループポリシーエディターで4種類のスクリプト(コンピューターの起動・シャットダウン、ユーザーのログオン・ログオフ)を割り当てられるとされています。
シャットダウンスクリプトの場所は コンピューターの構成\Windows の設定\スクリプト (スタートアップ/シャットダウン) です(Microsoft Learn)。
ただし、この方法を保存確認の目的に使うことはおすすめしません。
同じドキュメントに次の制約が明記されています。
- シャットダウンスクリプトは Local System として実行される(サインイン中のユーザーのデスクトップとは別の文脈で動く)
- スクリプトを同期実行に設定すると、シャットダウンの処理が遅くなる
- 参照先はWindows 7/Server世代の資料であり、Professional / Ultimate / Enterpriseという表記を現在のWindowsのエディション一覧とは扱わない
つまり「終了を止めて、ユーザーに保存を促して、返事を待つ」という用途には設計が合っていません。
ファイル実行が許可された環境で「終了前チェック」を作る
OS の終了処理に割り込むのではなく、自分がその入口を使うようにするのが現実的です。
本記事のスクリプトは表示だけで終了処理を含まないため、次の形で運用できます。
- デスクトップに新しいショートカットを作る(右クリック →[新規作成]→[ショートカット])
- 項目の場所に次を入れる
powershell.exe -NoProfile -WindowStyle Hidden -Sta -File "C:\Scripts\Reminder.ps1" -Mode BeforeExit - 名前を「終了前チェック」などにして、アイコンを分かりやすいものに変える
- 帰るときはこのショートカットを開き、表示されたメモを見てから、保存して自分で終了する
メモを閉じた後、各アプリで保存先と保存状態を確認してください。
保存の判断と終了操作は利用者が行います。
注意:Windows の電源ボタン、スタートメニューからの終了、更新による再起動は、この方法では捕まえられません。
「終了前に確認させる」仕組みではなく、「確認してから終了する習慣のための入口」です。
表示を止める・元へ戻す
メッセージを閉じれば、このスクリプト自体は終了します。
作成したタスクを止める場合は、その名前を確認して無効化し、既存の別タスクは変更しません。
使う前のXMLエクスポートや設定記録がある場合は、それと照合して戻します。
この作業ではタスク作成・ログオン・シャットダウンを実施しておらず、それらの動作は未検証です。
常駐アプリの見直しはNVIDIAの自動起動の記事、キーから練習処理を呼ぶ場合はAutoHotkey v2の記事を参照してください。
- 一時的に止める:タスクスケジューラで対象のタスクを右クリック →[無効]。設定は残るので、同じ場所で[有効]に戻せます。
- 完全に消す:同じメニューの[削除]。削除すると設定は戻せないため、[操作]タブの内容(プログラムと引数)を控えてから消します。
- ショートカットをやめる:デスクトップのショートカットを削除します。スクリプト本体(ps1)は残るので、使うのをやめるだけならショートカットの削除で十分です。
- 何も設定を変えていないことを確認したい:本記事のスクリプトは表示だけで、レジストリや電源設定を変更しません。やめるときに元へ戻す作業は、タスクとショートカットの削除だけです。
関連するWindows操作と従来の参考資料
以前の関連記事と外部コードの参照先です。
旧コードと本稿の練習ファイルは内容が異なるため、今回の手順では本稿のファイルを使います。





まとめ:表示と終了操作を分けて確認する
手動表示、タスクの実行、実際のサインインの順に確認します。
表示されない場合はエラーと実行ユーザーを記録し、既存タスクを変えずに原因を切り分けてください。
