PowerShellスクリプトが手動では動くのにタスクスケジューラでは動かない場合、実行ユーザー・開始フォルダ・引数・権限・ログの保存先を順番に確認します。スクリプトのコードが悪いとは限りません。
手動起動とタスク起動の環境差を確認する
- タスクの「全般」で実行アカウントを確認します。手動と異なるアカウントなら権限が変わります。
- 「操作」でプログラムに指定しているのがPowerShell実行ファイルか、引数に正しいスクリプトのフルパスがあるか確認します。共有フォルダーだけ参照できないならネットワーク接続と実行アカウントの問題、PCがスリープ中だけ実行されないならスリープ解除条件の問題として、一般的な「起動しない」問題と切り分けます。
- 「開始(オプション)」が空だと相対パスの基準が想定と異なる場合があります。
- タスクの履歴と最終実行結果を確認し、実行そのものが始まっているかを調べます。
タスク側の実行先と作業フォルダーを固定する
- スクリプトを複製して本番の変更処理を無効化し、診断用にします。
- タスクの操作に
powershell.exeと-NoProfile -File "C:\Work\job.ps1"のようなフルパス指定を使っているか確認します。 - 必要なら「開始」に
C:\Workのような作業フォルダを設定します。 - 診断版では日時、カレントディレクトリ、実行ユーザー、例外内容をローカルログに書き、手動実行と比較します。
- 実行アカウントから対象ファイルを読み取れることを確認してから、本来の処理を戻します。
開始位置と実行ユーザーの違いに注意
- 実行ポリシーを無条件にBypassへ変更する前に、ブロック理由と組織ポリシーを確認してください。
- 「最上位の特権で実行」を付けると権限リスクが増えます。必要性を確認します。
- アクセス拒否のログを得るために、秘密のパスワードや認証情報を出力しないでください。
タスク履歴とログで失敗場所を調べる
- 手動とタスク経由で、実行したスクリプトのパスとログ結果を比較します。
- 本番の外部書込みを戻す前に、診断だけのタスクが安定して動くことを確認します。
手動では動くのにタスクでは止まる例
PowerShellのスクリプトで./data.csvのような相対パスを使っていると、手動実行時はファイルが見つかっても、タスクスケジューラでは開始位置(作業ディレクトリ)が異なり失敗することがあります。タスクの[操作]にあるプログラムをpowershell.exe、引数を-NoProfile -File "C:\Work\job.ps1"のようにスクリプトへの実在するフルパスにし、[開始(オプション)]へそのスクリプトが想定する作業フォルダーを指定します(例は説明用であり、ファイルの存在は未確認)。
タスクの実行ユーザー、最高権限の有無、ネットワーク権限、終了コード、実行履歴も記録してください。ログに何も残らない場合は、まずファイル読み取り・ログ出力だけの安全なテスト用処理で実行環境を比較し、いきなり本番ファイルを操作しないでください。
