PowerShellのスクリプト(.ps1)をタスクスケジューラに登録したものの、手動では実行できるのにタスクスケジューラから実行すると動かないことがたまにあります。
私もタスクスケジューラで、タスク自体は正常に完了しますがpowershellファイル(ps1ファイル)が正常に実行できなかった事象がに遭遇しました。
解決まで少し苦戦したのでその時のメモを残しておきます。
1.事象:タスクは完了するのに実際にスクリプトは動いていない
タスクスケジューラで以下の設定を入れてタスクを作成しました。
- 「プログラムで開始」を選択して「C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe」を指定
- 引数として「-Executionpolicy Bypass -File ‘C:\task\test.ps1’」を指定
- 作業ディレクトリ(開始(オプション))に「C:\task」を指定
このタスクを実行しますが、スクリプトが起動しませんでした。
また、タスクの履歴には正常に完了したと記載されておりすぐに原因を特定できる感じではありませんでした。
2.今回の原因
引数で実行するpowershellファイルを指定する際にシングルクォーテーション(‘)を利用していたのが原因でした。
-Executionpolicy Bypass -File 'C:\task\test.ps1'
3.解決方法
ダブルクォーテーション(“)に変更すると正常に実行できるようになりました。
-Executionpolicy Bypass -File "C:\task\test.ps1"
4.その他の確認観点
その他の確認観点としては以下があります。
私も原因特定の際には確認しました。
①スクリプトの記載は正しいか?
スクリプト内の記載内容が誤っている可能性もあります。
誤字脱字があるとそもそもスクリプトのエラーとなりますのでこの観点でも注意が必要です。
実際にスクリプトの中身を手動で実行させてみて正常に実行されるかどうかを見てみるとよいです。
特にパスの指定などを誤ると、スクリプト自体は正常に完了しますが想定された動作にならないという事象につながります。
②ExecutionPolicyは適切か?
引数の追加(オプション)で以下のように設定されていれば問題ありません。
-ExecutionPolicy Bypass -File "C:\task\test.ps1"
③開始(オプション)でスクリプトがあるフォルダのパスが指定されているか?
指定されていれば問題ありません。(例:C:\task)
④「最上位の特権で実行する」になっているか?
タスクの「全般」タブでチェックを入れることで設定できます。
⑤powershell.exeはフルパスか?
基本的にフルパスでなくても実行可能かとは思いますが、フルパスにするとこの観点でのエラーは確実に防げるので試してみるといいと思います。
5.(参考)PowerShell 7を使用している場合
今回はWindows PowerShell 5.1を利用したので、powershell.exe を指定して利用しました。
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
一方、PowerShell 7では pwsh.exe を指定します。
例えば、PowerShell 7でスクリプトを実行する場合は以下のように記載します。
C:\Program Files\PowerShell\7\pwsh.exe
PowerShell 7で作成したスクリプトをタスクスケジューラから実行する場合は、powershell.exe と pwsh.exe を間違えないように注意が必要です。

