この記事は以下のシリーズの10番目の記事です。
この記事でやること
この記事では、PowerShellスクリプトファイル、つまり .ps1 ファイルを Windows のタスクスケジューラで実行する方法を整理します。
PowerShellを手動で実行できるようになると、次にやりたくなるのが定期実行です。
たとえば、次のような処理です。
| やりたいこと | 実行タイミング |
|---|---|
| ファイル一覧をCSV出力する | 毎日22時 |
| ログファイルを整理する | 毎週月曜 |
| 月次フォルダを作成する | 毎月1日 |
| 共有フォルダをバックアップする | 毎日深夜 |
| CSVを読み込んで一括処理する | 毎朝 |
このような処理は、タスクスケジューラで .ps1 を実行すると自動化できます。
今回作る構成
この記事では、次の構成で試します。
C:\work\ps-task-test
├─ task-sample.ps1
└─ logs
└─ task_20260705.log
task-sample.ps1 をタスクスケジューラから実行し、logs フォルダにログを出力します。
検証用フォルダを作る
まず、検証用フォルダを作成します。
New-Item -ItemType Directory -Path "C:\work\ps-task-test" -Force
Set-Location "C:\work\ps-task-test"
ログ用フォルダも作っておきます。
New-Item -ItemType Directory -Path ".\logs" -Force
確認します。
Get-ChildItem
実行するps1ファイルを作る
次に、タスクスケジューラから実行する .ps1 ファイルを作成します。
ファイル名は次の通りです。
C:\work\ps-task-test\task-sample.ps1
内容は次のようにします。
$logDir = Join-Path $PSScriptRoot "logs"
New-Item -ItemType Directory -Path $logDir -Force | Out-Null
$today = Get-Date -Format "yyyyMMdd"
$logPath = Join-Path $logDir "task_$today.log"
function Write-Log {
param(
[string]$Message
)
$now = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Add-Content -Path $logPath -Value "[$now] $Message" -Encoding UTF8
}
Write-Log "タスク開始"
try {
Write-Log "PowerShellスクリプトを実行しました"
Write-Log "実行ユーザー: $env:USERNAME"
Write-Log "スクリプト配置場所: $PSScriptRoot"
Get-ChildItem -Path $PSScriptRoot |
Select-Object Name, FullName, LastWriteTime |
Out-String |
Add-Content -Path $logPath -Encoding UTF8
Write-Log "タスク成功"
}
catch {
Write-Log "エラー発生: $($_.Exception.Message)"
}
finally {
Write-Log "タスク終了"
}
ポイントは、$PSScriptRoot を使っていることです。
$PSScriptRoot は、実行中の .ps1 ファイルが置かれているフォルダを表します。
タスクスケジューラから実行すると、カレントディレクトリが想定と違うことがあります。
そのため、スクリプトの場所を基準にできる $PSScriptRoot を使うと安定します。
まず手動で実行する
タスクスケジューラに登録する前に、必ず手動で動作確認します。
PowerShellを開き、次のように実行します。
Set-Location "C:\work\ps-task-test"
.\task-sample.ps1
ログが作成されたか確認します。
Get-ChildItem ".\logs"
Get-Content ".\logs\task_$(Get-Date -Format 'yyyyMMdd').log"
ここでログが出ていれば、スクリプト自体は正常に動いています。
手動で動かないスクリプトは、タスクスケジューラでも基本的に動きません。
まずは手動実行で成功することを確認します。
タスクスケジューラを開く
Windowsの検索で「タスク スケジューラ」と入力して起動します。
または、Win + R で「ファイル名を指定して実行」を開き、次のコマンドを入力します。
taskschd.msc
「基本タスクの作成」ではなく「タスクの作成」を使う
右側の操作メニューから、基本タスクの作成ではなく、タスクの作成を選びます。
「基本タスクの作成」でも簡単な設定はできます。
ただし、PowerShellを安定して実行するには、細かい設定ができる「タスクの作成」の方が扱いやすいです。
全般タブの設定
「全般」タブでは、タスク名と実行ユーザーを設定します。
例:
名前: PowerShell_Task_Sample
説明: PowerShellスクリプトの定期実行テスト
最初の検証では、次の設定で試すと原因を追いやすいです。
ユーザーがログオンしているときのみ実行する
夜間実行や無人実行をしたい場合は、次の設定を検討します。
ユーザーがログオンしているかどうかにかかわらず実行する
ただし、この設定では、実行ユーザーの権限やパスワード、共有フォルダへのアクセス権が問題になることがあります。
管理者権限が必要な処理では、次の項目も検討します。
最上位の特権で実行する
ただし、必要がないのに管理者権限で実行するのは避けた方が安全です。
トリガーを設定する
「トリガー」タブで、いつ実行するかを設定します。
例として、毎日22時に実行する場合は次のようにします。
新規
タスクの開始: スケジュールに従う
設定: 毎日
開始: 2026/07/05 22:00:00
検証するときは、数分後の時刻を指定すると動作確認しやすいです。
操作を設定する
「操作」タブで、PowerShellを実行する設定をします。
ここが一番重要です。
「新規」をクリックし、次のように設定します。
プログラムまたはスクリプト
Windows標準の Windows PowerShell 5.1 を使う場合は、次のように指定します。
powershell.exe
PowerShell 7 を使う場合は、次のように指定します。
pwsh.exe
会社PCでは、まず powershell.exe を前提にすることが多いです。
引数の追加
次のように指定します。
-NoProfile -ExecutionPolicy Bypass -File "C:\work\ps-task-test\task-sample.ps1"
それぞれの意味は次の通りです。
| 引数 | 意味 |
|---|---|
| -NoProfile | PowerShellプロファイルを読み込まない |
| -ExecutionPolicy Bypass | この実行時だけ実行ポリシー制限を回避 |
| -File | 実行するps1ファイルを指定 |
-NoProfile を付けると、ユーザーごとのプロファイル設定に依存しにくくなります。
タスクスケジューラで実行する場合は、付けておくと安定しやすいです。
-ExecutionPolicy Bypass は便利ですが、意味を理解せずに常用すべきではありません。
会社PCでは、社内の実行ポリシーやセキュリティルールを確認してください。
開始場所
開始場所には、スクリプトを置いたフォルダを指定します。
C:\work\ps-task-test
「開始場所」は空欄にしない方が安全です。
ただし、スクリプト内で $PSScriptRoot を使っていれば、開始場所に依存しにくくなります。
それでも、実務では開始場所を明示しておくことをおすすめします。
設定内容のまとめ
今回の設定は、次の通りです。
| 設定項目 | 入力内容 |
|---|---|
| プログラムまたはスクリプト | powershell.exe |
| 引数の追加 | -NoProfile -ExecutionPolicy Bypass -File "C:\work\ps-task-test\task-sample.ps1" |
| 開始場所 | C:\work\ps-task-test |
PowerShell 7の場合は、powershell.exe の代わりに pwsh.exe を指定します。
条件タブの確認
「条件」タブでは、電源やネットワークの条件を確認します。
特にノートPCでは、次の設定に注意します。
| 項目 | 注意点 |
|---|---|
| コンピューターをAC電源で使用している場合のみタスクを開始する | バッテリー時に動かない |
| タスクを実行するためにスリープを解除する | 夜間実行で必要になる場合がある |
| ネットワーク接続が使用可能な場合のみ開始する | 共有フォルダ利用時に関係する |
検証時は、条件が原因で動かないことがあります。
まずは不要な条件を外して、単純な状態で試すと切り分けやすいです。
設定タブの確認
「設定」タブでは、失敗時の再試行や停止条件を確認します。
たとえば、次のような設定を検討します。
| 項目 | 例 |
|---|---|
| タスクを要求時に実行する | 有効 |
| スケジュールされた時刻にタスクを開始できなかった場合、すぐに実行する | 必要に応じて有効 |
| タスクが失敗した場合の再起動の間隔 | 5分 |
| 再起動試行の最大回数 | 3回 |
| タスクを停止するまでの時間 | 1時間 |
最初の検証では、「タスクを要求時に実行する」を有効にしておくと便利です。
タスクを右クリックして手動実行できるため、動作確認がしやすくなります。
手動でタスクを実行する
タスクを作成したら、一覧から対象タスクを選び、右クリックして 実行 します。
しばらく待ってから、ログを確認します。
Get-ChildItem "C:\work\ps-task-test\logs"
Get-Content "C:\work\ps-task-test\logs\task_$(Get-Date -Format 'yyyyMMdd').log"
ログに次のような内容が出ていれば成功です。
[2026-07-05 22:00:00] タスク開始
[2026-07-05 22:00:00] PowerShellスクリプトを実行しました
[2026-07-05 22:00:00] 実行ユーザー: user01
[2026-07-05 22:00:00] スクリプト配置場所: C:\work\ps-task-test
[2026-07-05 22:00:00] タスク成功
[2026-07-05 22:00:00] タスク終了
タスクスケジューラの履歴を確認する
タスクスケジューラには、実行履歴を確認する機能があります。
対象タスクを選択し、「履歴」タブを確認します。
もし履歴が無効になっている場合は、右側メニューから すべてのタスク履歴を有効にする を選びます。
ただし、タスクスケジューラの履歴だけでは、スクリプト内の詳しいエラーまでは分かりにくいです。
そのため、スクリプト側でログを出すことが重要です。
手動実行用コマンドでも確認する
タスクスケジューラで指定する内容は、PowerShellやコマンドプロンプトからも確認できます。
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\work\ps-task-test\task-sample.ps1"
このコマンドで正常に動くなら、スクリプト自体は問題ない可能性が高いです。
逆に、このコマンドでも失敗するなら、タスクスケジューラ以前にスクリプトや実行ポリシー、パス指定に問題があります。
よくあるミス
1. ps1ファイルを直接指定している
「プログラムまたはスクリプト」に .ps1 ファイルを直接指定するのではなく、基本的には powershell.exe を指定します。
よくない例:
C:\work\ps-task-test\task-sample.ps1
よい例:
powershell.exe
そして、引数に .ps1 を指定します。
-NoProfile -ExecutionPolicy Bypass -File "C:\work\ps-task-test\task-sample.ps1"
2. 開始場所を空欄にしている
開始場所が空欄だと、相対パスを使っているスクリプトで問題が起きやすいです。
C:\work\ps-task-test
のように、スクリプトの配置フォルダを指定します。
ただし、スクリプト内では $PSScriptRoot を使う方がさらに安全です。
3. パスにスペースがあるのに引用符で囲んでいない
パスにスペースがある場合は、引用符で囲みます。
-File "C:\work\ps task test\task-sample.ps1"
引用符がないと、パスが途中で分割されて失敗することがあります。
4. ネットワークドライブを使っている
タスクスケジューラでは、手動ログオン時に見えている Z: ドライブなどが使えないことがあります。
よくない例:
Z:\share\script.ps1
可能であれば、UNCパスを使います。
\\server\share\script.ps1
ただし、実行ユーザーに共有フォルダへのアクセス権が必要です。
5. ユーザー入力が必要なスクリプトを書いている
タスクスケジューラで実行するスクリプトでは、ユーザー入力を求める処理は避けます。
避けたい例:
Read-Host "入力してください"
タスクスケジューラは無人実行になることが多いため、入力待ちになると処理が止まります。
必要な値は、CSVや設定ファイルに書いておく方が安定します。
6. ログを出していない
タスクスケジューラで一番困るのは、「動いたのか分からない」状態です。
最低限、次のログは出すようにします。
| ログ項目 | 例 |
|---|---|
| 開始 | タスク開始 |
| 終了 | タスク終了 |
| 成功 | タスク成功 |
| 失敗 | エラー発生 |
| 実行ユーザー | user01 |
| 対象ファイル | C:\work\sample.txt |
ログがないと、成功・失敗の切り分けが難しくなります。
実務で使いやすい最小テンプレート
タスクスケジューラで動かす .ps1 の最小テンプレートです。
$logDir = Join-Path $PSScriptRoot "logs"
New-Item -ItemType Directory -Path $logDir -Force | Out-Null
$today = Get-Date -Format "yyyyMMdd"
$logPath = Join-Path $logDir "task_$today.log"
function Write-Log {
param(
[string]$Message
)
$now = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Add-Content -Path $logPath -Value "[$now] $Message" -Encoding UTF8
}
Write-Log "タスク開始"
Write-Log "実行ユーザー: $env:USERNAME"
try {
# ここに実際の処理を書く
Write-Log "処理本体を実行しました"
Write-Log "タスク成功"
}
catch {
Write-Log "エラー発生: $($_.Exception.Message)"
}
finally {
Write-Log "タスク終了"
}
このテンプレートでは、次の点を押さえています。
| 要素 | 目的 |
|---|---|
$PSScriptRoot |
スクリプト配置場所を基準にする |
logs フォルダ作成 |
ログ出力先を確保する |
| 日付つきログ | 日単位で履歴を残す |
try/catch/finally |
エラーをログに残す |
| 実行ユーザー出力 | 権限問題の切り分けに使う |
まとめ
タスクスケジューラでPowerShellを実行する場合の基本設定は、次の通りです。
| 設定項目 | 値 |
|---|---|
| プログラムまたはスクリプト | powershell.exe |
| 引数の追加 | -NoProfile -ExecutionPolicy Bypass -File "C:\work\ps-task-test\task-sample.ps1" |
| 開始場所 | C:\work\ps-task-test |
PowerShell 7を使う場合は、powershell.exe ではなく pwsh.exe を指定します。
重要なポイントは次の5つです。
1つ目は、.ps1 を直接指定せず、powershell.exe の引数として指定すること。
2つ目は、開始場所を明示すること。
3つ目は、パスにスペースがある場合は引用符で囲むこと。
4つ目は、相対パスに依存しすぎず $PSScriptRoot を使うこと。
5つ目は、ログを必ず出すことです。
タスクスケジューラでPowerShellを動かすと、日次処理、月次処理、ファイル整理、CSV出力、ログ整理などを自動化できます。
ただし、画面で見えない場所で動く処理になるため、手動実行、ログ出力、実行ユーザー、権限、開始場所を必ず確認してから使うのが安全です。