0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

タスクスケジューラでPowerShellを実行する

0
Last updated at Posted at 2026-07-09

この記事は以下のシリーズの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出力、ログ整理などを自動化できます。

ただし、画面で見えない場所で動く処理になるため、手動実行、ログ出力、実行ユーザー、権限、開始場所を必ず確認してから使うのが安全です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?