タスクスケジューラでPowerShellのスクリプトが手動では動くのに実行されない
タスクから起動すると、作業フォルダーや実行アカウントが手動と変わることがあるためです。
プログラムは powershell.exe にし、引数で -ExecutionPolicy Bypass -File とスクリプトのフルパスを渡します。
スクリプト内のパスもフルパスにし、ログオンの設定を見直します。
- スクリプトを直接動かして確かめる
- 実行するプログラムを powershell.exe にし、.ps1 は引数で渡す
- 引数に -ExecutionPolicy Bypass を入れる
- スクリプト内の相対パスをフルパスか $PSScriptRoot 基準に直す
- ログオンしているときだけ実行する設定で一時的に試す
- 元の設定に戻しても結果(出力ファイルなど)ができていれば解決
※2026年9月時点のMicrosoft公式ドキュメントに基づく、Windows 11/10の「タスク スケジューラ」とWindows PowerShell 5.1(powershell.exe)での説明です。

1スクリプトを直接動かして確かめる
公式の切り分け記事も、タスクに入れる前にPowerShellやコマンド プロンプトでスクリプトを直接テストするよう勧めています。コマンド プロンプトで、タスクに書くのと同じ powershell.exe -ExecutionPolicy Bypass -File "C:\scripts\backup.ps1" を打ちます(作業フォルダーと実行アカウントは手動のまま)。手動がPowerShell 7なら pwsh.exe で試します。ここでエラーが出るなら、タスクではなくスクリプト側を直します。
2実行するプログラムを powershell.exe にする
タスクでは powershell.exe を起動し、-File でスクリプトを渡す
タスクの操作では、プログラムの欄に powershell.exe、引数の欄に -ExecutionPolicy Bypass -File "C:\scripts\backup.ps1" と書きます。-File より後ろはすべてスクリプトへ渡す値になるので、-File とパスは最後に置きます。
手動でPowerShell 7を使っているなら、プログラムの欄も pwsh.exe にそろえます。
出典: about_Scripts / about_PowerShell_exe / about_Pwsh
3実行ポリシーはそのタスクの中だけで指定する
Windows クライアントの既定の実行ポリシーは Restricted で、スクリプトを実行できません。自分に設定した実行ポリシー(CurrentUser)は現在のユーザーにのみ効くため、タスクが別のアカウントで動くと効かないことがあります。-ExecutionPolicy はそのセッションだけの指定で、レジストリの設定は変えずに済みます。
Bypass は何もブロックせず警告も出さない設定です。自分で書いたか、中身を確かめたスクリプトだけに使ってください。また、グループ ポリシーで決められた実行ポリシーより優先されることはないので、会社のPCで効かない場合は管理者に相談します。
4作業フォルダーとスクリプト内のパスを確かめる
作業フォルダーを指定しないと、タスクは %windir%\system32 で実行されます。.\data.csv のような相対パスも、そこを基準に探されます。操作の編集画面で作業フォルダーを指定する欄にスクリプトのフォルダーを入れるか、パスをフルパスか $PSScriptRoot(実行中のスクリプトのフォルダーが入る)基準に直します。
出典: New-ScheduledTaskAction / about_Scripts
5ログオンの設定で切り分ける
- ログオン中に手動実行で動くか試す
- 動けば実行アカウントまわりが原因と考えられる
- タスクを動かすアカウントを確かめる
- そのアカウントでファイルに入れるか確かめる
公式の切り分け手順も、ログオン時だけの設定で実行アカウントまわり(セキュリティ コンテキスト)の問題かを見分けるよう勧めています。切り分け用の一時的な設定なので、動いたら元に戻し、実行アカウントがファイルやフォルダーに入れるかを確かめます。
それでも動かない時のチェックリスト
正常に完了しても期待した出力が無いことがあるので、スクリプトの結果で確かめます。
出典: スケジュールされたタスクが実行されていない / about_PowerShell_exe / Start-Transcript