はじめに (対象読者・この記事でわかること)
この記事は、Windows Server やクライアント OS で「タスクスケジューラから PowerShell スクリプトを呼び出したいが、実行されない/エラーになる」という悩みを抱えたシステム運用担当者を対象としています。
記事を読むことで、以下のことがわかります。
- なぜ「そのまま」では PowerShell が動かないのか
- 実行ポリシー、非同期実行、ログ出力を制御するための正しい引数の付け方
- タスクスケジューラの「最も高い権限」「バッチログオン」など、つい見落としがちな設定の意味と使いどころ
弊社でも月次レポート生成スクリプトを 00:30 起動に登録したところ、朝には「最後に実行時刻」が更新されていない、という事象が続きました。本記事は、その時の調査・修正ログを整理したものです。
前提知識
- PowerShell スクリプト(
*.ps1)を作成・実行したことがある - Windows タスクスケジューラで「プログラムを起動」タスクを作ったことがある
- 管理者権限でコマンドプロンプト/PowerShell を開ける
なぜ「ただ指定するだけ」では動かないのか
PowerShell は「セキュリティ重視」のため、ダブルクリックやスケジューラ起動では実行ポリシーが制限され、スクリプトが黙ってスキップされることがあります。
また、PowerShell 本体 (powershell.exe) は、引数なしで起動すると対話モードになるため、タスクスケジューラの「非同期バッチ」として動作させるには追加オプションが必要です。
この 2 つの仕組み(実行ポリシー+起動モード)を理解しないままタスクを登録すると、「最後の実行結果 0x0」でも実質何も動いていない、という状態に陥ります。
タスクスケジューラで確実に PowerShell を動かすまでの道のり
ステップ1:最小構成で動作確認する
- 適当なフォルダー(例:
C:\TaskScripts\)に以下ファイルを作成
Hello.ps1powershell # 実行確認用 "Hello from $(Get-Date)" | Out-File -FilePath C:\TaskScripts\lastrun.log -Append - タスクスケジューラを開き「基本タスク」を作成
- 名前:
PowerShell最小動作テスト- トリガー:1 分後に 1 回のみ - 操作:- プログラム:
powershell.exe - 引数:
-ExecutionPolicy Bypass -File "C:\TaskScripts\Hello.ps1" - 開始場所:
C:\TaskScripts
- プログラム:
- セキュリティオプション:
- ユーザーを変更せず、最も高い権限で実行 にチェック
(※ローカル Administrators 権限が必要) - タスクを実行し、
C:\TaskScripts\lastrun.logに時刻が追記されれば OK
何も出力されない場合は、以下を順に確認します。
- 引数が間違っていないか(余分な/や"がないか) - 実行ポリシーが GPO で強制されていないか
Get-ExecutionPolicy -List- タスクの履歴が有効で、エラーコードが記録されているか
(イベントビュー
