はじめに (対象読者・この記事でわかること)

この記事は、Windows Server やクライアント OS で「タスクスケジューラから PowerShell スクリプトを呼び出したいが、実行されない/エラーになる」という悩みを抱えたシステム運用担当者を対象としています。
記事を読むことで、以下のことがわかります。

  • なぜ「そのまま」では PowerShell が動かないのか
  • 実行ポリシー、非同期実行、ログ出力を制御するための正しい引数の付け方
  • タスクスケジューラの「最も高い権限」「バッチログオン」など、つい見落としがちな設定の意味と使いどころ

弊社でも月次レポート生成スクリプトを 00:30 起動に登録したところ、朝には「最後に実行時刻」が更新されていない、という事象が続きました。本記事は、その時の調査・修正ログを整理したものです。

前提知識

  • PowerShell スクリプト(*.ps1)を作成・実行したことがある
  • Windows タスクスケジューラで「プログラムを起動」タスクを作ったことがある
  • 管理者権限でコマンドプロンプト/PowerShell を開ける

なぜ「ただ指定するだけ」では動かないのか

PowerShell は「セキュリティ重視」のため、ダブルクリックやスケジューラ起動では実行ポリシーが制限され、スクリプトが黙ってスキップされることがあります。
また、PowerShell 本体 (powershell.exe) は、引数なしで起動すると対話モードになるため、タスクスケジューラの「非同期バッチ」として動作させるには追加オプションが必要です。
この 2 つの仕組み(実行ポリシー+起動モード)を理解しないままタスクを登録すると、「最後の実行結果 0x0」でも実質何も動いていない、という状態に陥ります。

タスクスケジューラで確実に PowerShell を動かすまでの道のり

ステップ1:最小構成で動作確認する

  1. 適当なフォルダー(例:C:\TaskScripts\)に以下ファイルを作成
    Hello.ps1 powershell # 実行確認用 "Hello from $(Get-Date)" | Out-File -FilePath C:\TaskScripts\lastrun.log -Append
  2. タスクスケジューラを開き「基本タスク」を作成 - 名前:PowerShell最小動作テスト - トリガー:1 分後に 1 回のみ - 操作:
    • プログラム:powershell.exe
    • 引数:-ExecutionPolicy Bypass -File "C:\TaskScripts\Hello.ps1"
    • 開始場所:C:\TaskScripts
  3. セキュリティオプション: - ユーザーを変更せず、最も高い権限で実行 にチェック
    (※ローカル Administrators 権限が必要)
  4. タスクを実行し、C:\TaskScripts\lastrun.log に時刻が追記されれば OK
    何も出力されない場合は、以下を順に確認します。
    - 引数が間違っていないか(余分な /" がないか) - 実行ポリシーが GPO で強制されていないか
    Get-ExecutionPolicy -List - タスクの履歴が有効で、エラーコードが記録されているか
    (イベントビュー