PowerShellでScheduled TaskをXMLで管理!エクスポート・インポート方法とバージョン管理の手順を解説

WindowsのScheduled Task(タスクスケジューラ)は、特定の時間やイベントに基づいて自動的にスクリプトやプログラムを実行する便利な機能です。しかし、手動でタスクを作成・管理すると、設定ミスや環境ごとの差異が発生しやすくなります。そこで、PowerShellを活用してScheduled TaskをXML形式でエクスポート・インポートし、バージョン管理する方法を紹介します。

本記事では、以下の内容について詳しく解説します。

  • PowerShellを使用したScheduled Taskの基本操作
  • XML形式でタスクをエクスポート・インポートする方法
  • XMLエクスポート・インポート時の注意点とエラー対処法
  • Gitを活用したScheduled Taskのバージョン管理
  • バージョン管理の自動化スクリプトの作成
  • XMLファイルの設定詳細とカスタマイズ方法
  • 応用編:複数のタスクを一括管理する手法

これらの手法を活用することで、Scheduled Taskの管理を自動化し、設定ミスを防ぐことができます。特に、タスクのバージョン管理を行うことで、変更履歴を追跡し、過去の設定に簡単に戻せるため、システム管理者にとって大きなメリットとなります。

それでは、まずPowerShellを使ったScheduled Taskの基本操作から見ていきましょう。

目次

PowerShellを使ったScheduled Taskの基本操作


WindowsのScheduled Task(タスクスケジューラ)は、GUIからも管理できますが、PowerShellを使うことで、タスクの作成・取得・変更・削除を効率的に行えます。ここでは、PowerShellでScheduled Taskを操作する基本的なコマンドを紹介します。

Scheduled Taskの一覧を表示する


現在登録されているタスクを一覧表示するには、Get-ScheduledTask コマンドレットを使用します。

# すべてのタスクを一覧表示
Get-ScheduledTask

# 特定のタスクの詳細を表示(例: "BackupTask" という名前のタスク)
Get-ScheduledTask -TaskName "BackupTask"

Get-ScheduledTask を使用することで、現在登録されているすべてのタスクの情報を取得できます。

新しいScheduled Taskを作成する


PowerShellで新しいScheduled Taskを作成する場合、New-ScheduledTaskAction や New-ScheduledTaskTrigger を組み合わせて使用します。

# タスクのアクション(実行するスクリプト)
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File C:\Scripts\backup.ps1"

# タスクのトリガー(毎日AM3:00に実行)
$trigger = New-ScheduledTaskTrigger -Daily -At 3am

# タスクを作成して登録
Register-ScheduledTask -TaskName "DailyBackup" -Action $action -Trigger $trigger -Description "毎日3時にバックアップを実行"

このスクリプトでは、毎日午前3時に C:\Scripts\backup.ps1 を実行するタスクを登録します。

Scheduled Taskを手動で実行する


登録済みのScheduled Taskをすぐに実行する場合は、Start-ScheduledTask を使用します。

Start-ScheduledTask -TaskName "DailyBackup"

タスクを手動で実行し、正常に動作するかを確認できます。

Scheduled Taskを無効化・有効化する


タスクの実行を一時停止したい場合は、Disable-ScheduledTask を使用します。再度有効化するには Enable-ScheduledTask を使用します。

# タスクを無効化
Disable-ScheduledTask -TaskName "DailyBackup"

# タスクを有効化
Enable-ScheduledTask -TaskName "DailyBackup"

Scheduled Taskを削除する


不要になったタスクを削除するには、Unregister-ScheduledTask を使用します。

Unregister-ScheduledTask -TaskName "DailyBackup" -Confirm:$false

-Confirm:$false を指定すると、確認なしでタスクが削除されます。


ここまでで、PowerShellを使用してScheduled Taskの作成・取得・管理を行う方法を説明しました。次に、XML形式でScheduled Taskをエクスポートする方法を解説します。

XML形式でScheduled Taskをエクスポートする方法


Scheduled TaskをXML形式でエクスポートすると、タスクの設定をバックアップしたり、他の環境へコピーしたりできます。PowerShellを使用すれば、手作業を減らし、スクリプトによる自動化も可能です。

基本的なエクスポート方法


PowerShellには、Export-ScheduledTask というコマンドが用意されており、これを使うことでタスクの設定をXML形式でエクスポートできます。

# "DailyBackup" タスクを XML 形式でエクスポート
Export-ScheduledTask -TaskName "DailyBackup"

このコマンドを実行すると、Scheduled Taskの設定がXML形式で出力されます。ただし、標準出力に表示されるだけなので、ファイルに保存する場合はリダイレクトを使用します。

# XMLファイルとして保存
Export-ScheduledTask -TaskName "DailyBackup" | Out-File "C:\Backup\DailyBackup.xml"

これで C:\Backup\DailyBackup.xml にタスクの設定が保存されます。

複数のタスクを一括でエクスポートする


複数のタスクを一括でエクスポートするには、Get-ScheduledTask を組み合わせてループ処理を行います。

# すべてのタスクを C:\Backup に XML ファイルとして保存
Get-ScheduledTask | ForEach-Object {
    $taskName = $_.TaskName
    Export-ScheduledTask -TaskName $taskName | Out-File "C:\Backup\$taskName.xml"
}

これにより、C:\Backup フォルダ内にすべてのScheduled TaskのXMLファイルが作成されます。

特定のフォルダ内のタスクをエクスポートする


Scheduled Taskにはフォルダ(パス)があります。特定のフォルダに属するタスクのみをエクスポートする場合は、TaskPath を使用します。

# "MyTasks" フォルダ内のタスクのみエクスポート
Get-ScheduledTask | Where-Object { $_.TaskPath -like "\MyTasks\*" } | ForEach-Object {
    $taskName = $_.TaskName
    Export-ScheduledTask -TaskName $taskName | Out-File "C:\Backup\$taskName.xml"
}

例えば \MyTasks\BackupTask のようなタスクのみをエクスポートできます。

エクスポートしたXMLの内容


エクスポートされたXMLファイルは、以下のようなフォーマットになっています。

<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Description>毎日3時にバックアップを実行</Description>
  </RegistrationInfo>
  <Triggers>
    <CalendarTrigger>
      <StartBoundary>2023-01-01T03:00:00</StartBoundary>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
  </Triggers>
  <Actions>
    <Exec>
      <Command>powershell.exe</Command>
      <Arguments>-File C:\Scripts\backup.ps1</Arguments>
    </Exec>
  </Actions>
</Task>

このXMLファイルを利用して、他のPCや環境に同じタスクを復元できます。


次のセクションでは、エクスポートしたXMLファイルをPowerShellでインポートする方法を解説します。

XMLファイルを使ったScheduled Taskのインポート方法


エクスポートしたXMLファイルを使えば、同じScheduled Taskを他の環境に簡単に復元できます。PowerShellを使用することで、自動化やスクリプトによる一括管理も可能になります。

基本的なインポート方法


Scheduled Taskをインポートするには、Register-ScheduledTask コマンドを使用します。

# XMLファイルをインポートしてScheduled Taskを登録
Register-ScheduledTask -TaskName "DailyBackup" -Xml (Get-Content "C:\Backup\DailyBackup.xml" -Raw) -User "SYSTEM"

このコマンドでは、C:\Backup\DailyBackup.xml のXMLファイルを読み取り、タスクを “DailyBackup” という名前で登録します。

オプションの解説

  • -TaskName "DailyBackup" :タスクの名前を指定
  • -Xml (Get-Content "C:\Backup\DailyBackup.xml" -Raw) :XMLファイルの内容を取得し、タスクとして登録
  • -User "SYSTEM" :タスクの実行ユーザーを SYSTEM に設定(管理者権限が必要)

XMLインポート時のユーザー設定


エクスポートされたXMLには実行ユーザー情報が含まれていない場合があるため、-User パラメータで明示的に指定することを推奨します。

例えば、特定のユーザー(例: Administrator)としてタスクを登録する場合は以下のようにします。

Register-ScheduledTask -TaskName "DailyBackup" -Xml (Get-Content "C:\Backup\DailyBackup.xml" -Raw) -User "Administrator"

この場合、Administrator ユーザーの資格情報が求められます。

複数のタスクを一括でインポートする


複数のXMLファイルを一括でインポートする場合は、以下のスクリプトを使用できます。

# C:\Backup 内のすべてのXMLファイルをインポートしてタスクを登録
Get-ChildItem -Path "C:\Backup" -Filter "*.xml" | ForEach-Object {
    $taskName = $_.BaseName
    Register-ScheduledTask -TaskName $taskName -Xml (Get-Content $_.FullName -Raw) -User "SYSTEM"
}

このスクリプトは、フォルダ内のすべてのXMLファイルを検索し、それぞれのファイル名をタスク名としてScheduled Taskを登録します。

既存のタスクを上書きしてインポートする


デフォルトでは、Register-ScheduledTask は既存のタスクがあるとエラーになります。上書きしたい場合は、まずタスクを削除 (Unregister-ScheduledTask) してから登録するか、-Force オプションを使用します。

# 既存のタスクを削除してからインポート
Unregister-ScheduledTask -TaskName "DailyBackup" -Confirm:$false
Register-ScheduledTask -TaskName "DailyBackup" -Xml (Get-Content "C:\Backup\DailyBackup.xml" -Raw) -User "SYSTEM"

または、タスクを上書き登録したい場合は Set-ScheduledTask を使用できます。

# 既存のタスクを上書き更新
$xmlContent = Get-Content "C:\Backup\DailyBackup.xml" -Raw
Register-ScheduledTask -TaskName "DailyBackup" -Xml $xmlContent -User "SYSTEM" -Force

インポート時のエラー対処法


XMLをインポートする際に発生する可能性のあるエラーとその対処法を紹介します。

エラー内容原因対処法
Register-ScheduledTask : The parameter is incorrectXMLのフォーマットが正しくないXMLファイルの内容を確認し、正しい形式であることを確認
Access is denied管理者権限が不足PowerShellを管理者モードで実行
A task or folder with this name already exists同じ名前のタスクが既に存在-Force オプションを使うか、Unregister-ScheduledTask で削除後に再登録
User does not have permission to register this taskユーザー権限が不足-User SYSTEM または適切な管理者ユーザーを指定

このように、Scheduled TaskをXMLでインポートすることで、環境間の移行や設定の復元を簡単に行うことができます。
次のセクションでは、XMLエクスポート・インポート時の注意点とエラー対処法について詳しく解説します。

XMLエクスポート・インポート時の注意点とエラー対処法


Scheduled TaskをXML形式でエクスポート・インポートする際、いくつかの問題が発生する可能性があります。ここでは、よくあるエラーとその解決方法を紹介します。

エクスポート時の注意点

1. XMLファイルにパスワード情報は含まれない


エクスポートされたXMLファイルには、タスクを実行するユーザーのパスワード情報は含まれません。そのため、インポート後にユーザー資格情報を設定し直す必要があります。

対処法:タスク登録後にユーザー資格情報を更新

# タスクを手動で登録し直し、資格情報を指定する
$task = Get-ScheduledTask -TaskName "DailyBackup"
Set-ScheduledTask -TaskName "DailyBackup" -User "Administrator"

もしくは、Register-ScheduledTask コマンドで-User パラメータを指定し、明示的に設定します。

Register-ScheduledTask -TaskName "DailyBackup" -Xml (Get-Content "C:\Backup\DailyBackup.xml" -Raw) -User "Administrator"

2. ユーザー情報が異なる環境でのインポート


異なるPCやユーザー環境にタスクをインポートする場合、エクスポート時のユーザーが存在しない場合があります。

対処法:インポート時に-Userを指定する

Register-ScheduledTask -TaskName "DailyBackup" -Xml (Get-Content "C:\Backup\DailyBackup.xml" -Raw) -User "SYSTEM"

インポート時のエラーと解決策

1. `Register-ScheduledTask : The parameter is incorrect`


原因: XMLのフォーマットが正しくない可能性があります。

対処法: XMLファイルを開き、不要な改行や特殊文字が含まれていないか確認する。また、PowerShellで正しくエンコードされたファイルを作成するようにする。

# UTF-8エンコードでエクスポート
Export-ScheduledTask -TaskName "DailyBackup" | Out-File "C:\Backup\DailyBackup.xml" -Encoding utf8

2. `Access is denied`(アクセス拒否)


原因: PowerShellが管理者権限で実行されていない、またはタスク登録に適切な権限がない。

対処法:

  1. PowerShellを「管理者として実行」する。
  2. -User SYSTEM を指定する。
Register-ScheduledTask -TaskName "DailyBackup" -Xml (Get-Content "C:\Backup\DailyBackup.xml" -Raw) -User "SYSTEM"

3. `A task or folder with this name already exists`


原因: 既に同じ名前のタスクが存在している。

対処法: 既存のタスクを削除してから再登録するか、上書き登録する。

# 既存のタスクを削除してからインポート
Unregister-ScheduledTask -TaskName "DailyBackup" -Confirm:$false
Register-ScheduledTask -TaskName "DailyBackup" -Xml (Get-Content "C:\Backup\DailyBackup.xml" -Raw) -User "SYSTEM"

または、-Force オプションを使用して上書きする。

Register-ScheduledTask -TaskName "DailyBackup" -Xml (Get-Content "C:\Backup\DailyBackup.xml" -Raw) -User "SYSTEM" -Force

4. `User does not have permission to register this task`


原因: ユーザー権限が不足している。

対処法:

  1. 管理者アカウントで実行する
  2. -User SYSTEM を指定する
  3. タスクを適切なユーザーに割り当てる
Register-ScheduledTask -TaskName "DailyBackup" -Xml (Get-Content "C:\Backup\DailyBackup.xml" -Raw) -User "Administrator"

その他のトラブルシューティング

XMLファイルが破損している場合の対処


XMLファイルが破損している場合、インポートが失敗することがあります。その場合、スクリプトでXMLのバリデーションを実施し、問題がないか確認できます。

# XMLファイルの整合性を確認
[xml]$xml = Get-Content "C:\Backup\DailyBackup.xml"
$xml.Save("C:\Backup\ValidatedDailyBackup.xml")

このスクリプトを実行し、エラーが出なければXMLは有効です。


Scheduled Taskのエクスポート・インポート時には、特にユーザー情報や権限の問題に注意が必要です。
次のセクションでは、Gitを活用したScheduled Taskのバージョン管理について解説します。

Gitを活用したScheduled Taskのバージョン管理


Scheduled TaskをXML形式でエクスポートできるようになったら、Gitを使ってバージョン管理を行うことで、変更履歴を追跡し、過去の設定に簡単に戻すことができます。これにより、タスクの誤変更や環境ごとの差異を管理しやすくなります。

Gitでバージョン管理するメリット

  • 変更履歴を追跡できる:いつ、誰が、どの設定を変更したのかを記録できる
  • 復元が簡単:誤って設定を変更してしまっても、過去のバージョンに戻せる
  • 環境ごとの差異を管理できる:本番環境と開発環境で異なるタスク設定を分けて管理できる
  • チームでの管理が容易:リポジトリを共有することで、複数人で設定を管理できる

Gitを使ったScheduled Taskの管理手順

1. Gitリポジトリを作成する


まず、Scheduled Taskを管理するためのフォルダを作成し、Gitリポジトリを初期化します。

# Git管理用のディレクトリを作成
New-Item -ItemType Directory -Path "C:\ScheduledTaskBackup" -Force

# フォルダに移動
Set-Location "C:\ScheduledTaskBackup"

# Gitリポジトリを初期化
git init

2. Scheduled TaskをエクスポートしてGitに追加


Scheduled Taskを定期的にエクスポートし、Gitで管理できるようにします。

# エクスポートするScheduled Taskのリストを取得
$tasks = Get-ScheduledTask

# それぞれのタスクをXML形式で保存
foreach ($task in $tasks) {
    $taskName = $task.TaskName
    Export-ScheduledTask -TaskName $taskName | Out-File "C:\ScheduledTaskBackup\$taskName.xml"
}

# Gitにファイルを追加
git add .

# 初回コミット
git commit -m "Initial commit: Backup of all scheduled tasks"

3. 変更をGitで管理


Scheduled Taskの設定に変更があった場合、以下の手順で変更を記録します。

# 変更をエクスポート
foreach ($task in Get-ScheduledTask) {
    $taskName = $task.TaskName
    Export-ScheduledTask -TaskName $taskName | Out-File "C:\ScheduledTaskBackup\$taskName.xml"
}

# Gitで変更を確認
git status

# 変更を追加してコミット
git add .
git commit -m "Updated Scheduled Task configuration"

4. 過去のバージョンに戻す


タスクの設定を過去の状態に戻したい場合、Gitの履歴からリストアできます。

# 過去のコミットを確認
git log --oneline

# 特定のコミットの状態に戻す(例: abc1234 のコミットに戻す)
git checkout abc1234 -- "C:\ScheduledTaskBackup\DailyBackup.xml"

# その設定をインポートして元に戻す
Register-ScheduledTask -TaskName "DailyBackup" -Xml (Get-Content "C:\ScheduledTaskBackup\DailyBackup.xml" -Raw) -User "SYSTEM"

5. GitHubにバックアップを保存(オプション)


ローカルのGitリポジトリをGitHubにプッシュすれば、リモートでも管理できます。

# GitHubリポジトリを追加
git remote add origin https://github.com/yourusername/ScheduledTaskBackup.git

# GitHubにプッシュ
git push -u origin main

※ GitHubにプッシュする場合、機密情報が含まれないように注意してください。

自動化:定期的にScheduled TaskをGitにバックアップ


タスクのバックアップを自動化するには、Scheduled Taskに以下のスクリプトを登録します。

$backupPath = "C:\ScheduledTaskBackup"

# タスクのエクスポート
foreach ($task in Get-ScheduledTask) {
    $taskName = $task.TaskName
    Export-ScheduledTask -TaskName $taskName | Out-File "$backupPath\$taskName.xml"
}

# Gitに変更を記録
Set-Location $backupPath
git add .
git commit -m "Automated backup of Scheduled Tasks on $(Get-Date -Format 'yyyy-MM-dd HH:mm')"
git push origin main

このスクリプトをScheduled Taskに登録することで、定期的にタスク設定をGitへバックアップできます。


Gitを活用することで、Scheduled Taskの設定変更を確実に記録し、誤変更の防止や環境間の一貫性維持が容易になります。
次のセクションでは、バージョン管理の自動化(PowerShellスクリプト)を解説します。

バージョン管理の自動化(PowerShellスクリプト)


Scheduled TaskのXMLエクスポートとGitを組み合わせることで、タスクのバージョン管理を自動化できます。PowerShellスクリプトを作成し、定期的に実行すれば、タスクの設定変更を自動的に記録し、いつでも過去の状態に戻せるようになります。


PowerShellスクリプトでScheduled Taskのバックアップを自動化

以下のPowerShellスクリプトは、Scheduled TaskをXML形式でエクスポートし、Gitで自動的にバージョン管理するものです。

# Scheduled Taskのバックアップディレクトリ
$backupPath = "C:\ScheduledTaskBackup"

# Gitリポジトリの初期化(最初の実行時のみ)
if (-not (Test-Path "$backupPath\.git")) {
    Write-Host "Initializing Git repository..."
    git init $backupPath
}

# タスクのエクスポート
Write-Host "Exporting Scheduled Tasks..."
$tasks = Get-ScheduledTask
foreach ($task in $tasks) {
    $taskName = $task.TaskName
    $xmlFile = "$backupPath\$taskName.xml"

    # タスクをXMLとしてエクスポート
    Export-ScheduledTask -TaskName $taskName | Out-File $xmlFile

    # ファイルの変更がある場合のみGitに追加
    if (-not (git diff --quiet $xmlFile)) {
        git add $xmlFile
    }
}

# 変更がある場合のみコミットとプッシュを実行
if (-not (git diff --quiet)) {
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm"
    git commit -m "Automated backup of Scheduled Tasks on $timestamp"
    git push origin main
    Write-Host "Changes committed and pushed to remote repository."
} else {
    Write-Host "No changes detected. No commit necessary."
}

スクリプトの動作

  1. Scheduled Taskの一覧を取得
  • Get-ScheduledTask で現在のタスク一覧を取得
  1. XMLファイルとしてエクスポート
  • Export-ScheduledTask を使用し、各タスクをXMLファイルに保存
  1. Gitで変更がある場合のみコミット&プッシュ
  • git diff --quiet を使い、変更がある場合のみgit add → git commit → git push を実行

スクリプトの自動実行をScheduled Taskに登録


このスクリプトを定期的に実行するには、自身をScheduled Taskとして登録します。

# バックアップスクリプトのパス
$scriptPath = "C:\ScheduledTaskBackup\backup_tasks.ps1"

# タスクのアクション(スクリプトをPowerShellで実行)
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File $scriptPath"

# タスクのトリガー(毎日1回実行)
$trigger = New-ScheduledTaskTrigger -Daily -At 12am

# タスクを登録
Register-ScheduledTask -TaskName "ScheduledTaskBackup" -Action $action -Trigger $trigger -Description "Scheduled Taskの設定をGitにバックアップ"

この設定により、毎日午前0時 にバックアップが自動実行されます。


リモート環境(GitHub)への保存


リモートのGitリポジトリ(GitHubやGitLab)にプッシュする場合は、GitHubの個人アクセストークン(PAT)を使うか、SSHキーを設定する必要があります。
以下のようにリモートリポジトリを設定し、スクリプト内で自動的にプッシュすることができます。

# GitHubリポジトリを追加(最初の設定のみ)
git remote add origin https://github.com/yourusername/ScheduledTaskBackup.git

# SSH認証を使用する場合
git remote add origin [email protected]:yourusername/ScheduledTaskBackup.git

スクリプトのメリット


✅ 完全自動化:人手を介さずにScheduled Taskのバックアップが定期的に実行される
✅ 履歴を追跡可能:変更履歴がGitに記録され、誰がいつ変更したかを確認できる
✅ 復元が容易:誤ってタスクを削除しても、過去のバージョンをすぐに復元可能


このスクリプトを使用すれば、Scheduled Taskの管理が大幅に簡単になります。
次のセクションでは、XMLによるタスク設定の詳細解説(タグやパラメータ)を紹介します。

XMLによるタスク設定の詳細解説(タグやパラメータ)


PowerShellでエクスポートしたScheduled TaskのXMLファイルには、タスクの詳細な設定が含まれています。このXMLを直接編集することで、手動では設定できない細かなカスタマイズも可能になります。ここでは、XMLの構造と主要なタグについて解説します。


エクスポートされたScheduled TaskのXMLの構造


PowerShellでエクスポートされたScheduled TaskのXMLファイルは、以下のような構造になっています。

<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Description>毎日3時にバックアップを実行</Description>
  </RegistrationInfo>
  <Triggers>
    <CalendarTrigger>
      <StartBoundary>2023-01-01T03:00:00</StartBoundary>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
  </Triggers>
  <Actions>
    <Exec>
      <Command>powershell.exe</Command>
      <Arguments>-File C:\Scripts\backup.ps1</Arguments>
    </Exec>
  </Actions>
</Task>

このXMLを解析すると、タスクの実行内容やスケジュールがどのように設定されているのかが分かります。


主要なタグとその設定

1. “ – タスクの基本情報


このセクションには、タスクの名前、説明、作成者などが記述されています。

<RegistrationInfo>
    <Description>毎日3時にバックアップを実行</Description>
    <Author>Administrator</Author>
</RegistrationInfo>
  • <Description>: タスクの説明(オプション)
  • <Author>: タスクを作成したユーザー名

2. “ – タスクの実行スケジュール


タスクの実行タイミングを定義します。代表的なトリガーの種類を紹介します。

1. 毎日実行するトリガー
<CalendarTrigger>
    <StartBoundary>2023-01-01T03:00:00</StartBoundary>
    <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
    </ScheduleByDay>
</CalendarTrigger>
  • <StartBoundary>: タスクの開始時間(ISO 8601形式)
  • <DaysInterval>: 実行間隔(日単位)
2. 特定の曜日に実行するトリガー
<CalendarTrigger>
    <StartBoundary>2023-01-01T03:00:00</StartBoundary>
    <ScheduleByWeek>
        <WeeksInterval>1</WeeksInterval>
        <DaysOfWeek>
            <Monday />
            <Wednesday />
            <Friday />
        </DaysOfWeek>
    </ScheduleByWeek>
</CalendarTrigger>
  • <WeeksInterval>: 実行間隔(週単位)
  • <DaysOfWeek>: 実行する曜日(<Monday/> などを指定)
3. PCの起動時に実行するトリガー
<BootTrigger />

このトリガーを追加すると、PC起動時にタスクが実行されます。


3. “ – タスクが実行するコマンド


タスクが実行する処理を定義します。

<Actions>
    <Exec>
        <Command>powershell.exe</Command>
        <Arguments>-File C:\Scripts\backup.ps1</Arguments>
    </Exec>
</Actions>
  • <Command>: 実行するプログラム(この場合はpowershell.exe)
  • <Arguments>: コマンドに渡す引数
例: バッチファイルを実行する
<Actions>
    <Exec>
        <Command>C:\Scripts\backup.bat</Command>
    </Exec>
</Actions>

4. “ – タスクの詳細設定


タスクの動作設定を定義します。

<Settings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <DontStopIfGoingOnBatteries>false</DontStopIfGoingOnBatteries>
    <StartWhenAvailable>true</StartWhenAvailable>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
</Settings>
  • <AllowStartOnDemand>: 手動実行を許可する (true/false)
  • <DontStopIfGoingOnBatteries>: バッテリー駆動時の動作 (true = 実行継続, false = 中断)
  • <StartWhenAvailable>: システムが起動後、可能な限り早く実行する
  • <MultipleInstancesPolicy>: タスクが複数実行された場合の処理
  • IgnoreNew: 既存のタスクが完了するまで新しいタスクを実行しない
  • Parallel: 並列で実行
  • Queue: キューに追加して順次実行

XMLファイルを直接編集してインポート


上記のXMLを直接編集し、Register-ScheduledTask で再登録すると、設定をカスタマイズできます。

Register-ScheduledTask -TaskName "DailyBackup" -Xml (Get-Content "C:\Backup\DailyBackup.xml" -Raw) -User "SYSTEM"

カスタムXMLを活用した応用例

1. ログイン時に特定のスクリプトを実行

<LogonTrigger>
    <UserId>Administrator</UserId>
</LogonTrigger>

この設定をXMLに追加すれば、特定のユーザーがログインしたときにタスクを実行できます。

2. 1時間ごとにタスクを実行

<Repetition>
    <Interval>PT1H</Interval>
    <Duration>P1D</Duration>
</Repetition>
  • <Interval>: タスクの繰り返し間隔(この場合は1時間)
  • <Duration>: 1日の間に実行(P1D)

まとめ

  • Scheduled TaskのXMLは、タスクの詳細な設定を保持する
  • <Triggers> を変更すると実行スケジュールをカスタマイズできる
  • <Actions> を変更すると、実行するスクリプトやコマンドを変更できる
  • <Settings> を調整することで、タスクの動作を細かく制御できる

このように、XMLの内容を理解すれば、より柔軟にScheduled Taskを管理・カスタマイズできます。
次のセクションでは、応用編:複数のタスクを一括管理する方法を解説します。

応用編:複数のタスクを一括管理する方法


複数のScheduled Taskをエクスポート・インポートし、バージョン管理することで、大規模なシステムでも一貫したタスク管理が可能になります。本章では、複数のタスクを一括でエクスポート・インポートし、自動化する方法を紹介します。


1. すべてのScheduled Taskを一括エクスポート


複数のタスクを一括でXML形式にエクスポートするには、Get-ScheduledTask を使用します。

# バックアップ用のフォルダを作成
$backupPath = "C:\ScheduledTaskBackup"
If (!(Test-Path -Path $backupPath)) {
    New-Item -ItemType Directory -Path $backupPath
}

# すべてのScheduled TaskをXML形式でエクスポート
Get-ScheduledTask | ForEach-Object {
    $taskName = $_.TaskName
    $taskPath = "$backupPath\$taskName.xml"

    # タスクをXMLとして保存
    Export-ScheduledTask -TaskName $taskName | Out-File $taskPath
}

Write-Host "All Scheduled Tasks have been exported to $backupPath"

✅ このスクリプトのポイント

  • Get-ScheduledTask でタスク一覧を取得
  • ForEach-Object でタスクをループ処理
  • Export-ScheduledTask を用いてXML形式で保存
  • Test-Path を使い、フォルダが存在しない場合は作成

2. 特定のフォルダ内のScheduled Taskのみエクスポート


特定のフォルダ内のタスクのみをエクスポートしたい場合、以下のように TaskPath を指定します。

# "MyTasks" フォルダ内のScheduled Taskのみをエクスポート
$backupPath = "C:\ScheduledTaskBackup"
$taskFolder = "\MyTasks\"

Get-ScheduledTask | Where-Object { $_.TaskPath -like "$taskFolder*" } | ForEach-Object {
    $taskName = $_.TaskName
    Export-ScheduledTask -TaskName $taskName | Out-File "$backupPath\$taskName.xml"
}

Write-Host "Scheduled Tasks under $taskFolder have been exported."

✅ このスクリプトのポイント

  • Where-Object { $_.TaskPath -like "$taskFolder*" } を使って特定のフォルダ内のタスクのみ抽出
  • フォルダごとにタスクを分けて保存できる

3. 複数のScheduled Taskを一括インポート


エクスポートしたXMLファイルを使い、タスクを一括で復元できます。

# XMLファイルを一括インポート
$backupPath = "C:\ScheduledTaskBackup"

Get-ChildItem -Path $backupPath -Filter "*.xml" | ForEach-Object {
    $taskName = $_.BaseName
    Register-ScheduledTask -TaskName $taskName -Xml (Get-Content $_.FullName -Raw) -User "SYSTEM"
}

Write-Host "All Scheduled Tasks have been imported."

✅ このスクリプトのポイント

  • Get-ChildItem を使い、フォルダ内のすべてのXMLファイルを取得
  • Register-ScheduledTask でXMLをタスクとして登録

⚠️ 注意:

  • タスク名はXMLファイルのファイル名をそのまま使用
  • -User "SYSTEM" を指定し、適切なユーザー権限で登録

4. 既存のタスクを削除してから一括インポート


既存のタスクを削除してからインポートする場合、以下のスクリプトを使用します。

# 既存のScheduled Taskをすべて削除してからインポート
$backupPath = "C:\ScheduledTaskBackup"

# 既存のタスクを削除
Get-ScheduledTask | ForEach-Object {
    Unregister-ScheduledTask -TaskName $_.TaskName -Confirm:$false
}

# XMLファイルをすべてインポート
Get-ChildItem -Path $backupPath -Filter "*.xml" | ForEach-Object {
    $taskName = $_.BaseName
    Register-ScheduledTask -TaskName $taskName -Xml (Get-Content $_.FullName -Raw) -User "SYSTEM"
}

Write-Host "All Scheduled Tasks have been reset and imported from backup."

✅ このスクリプトのポイント

  • Unregister-ScheduledTask を実行し、既存のタスクをすべて削除
  • その後、XMLファイルからタスクを再登録
  • -Confirm:$false を指定することで、削除確認をスキップ

5. Gitと組み合わせて一括管理


Scheduled TaskのバックアップをGitで管理することで、変更履歴を追跡し、過去の設定に簡単に戻せます。

# Scheduled TaskをエクスポートしてGitにコミット
$backupPath = "C:\ScheduledTaskBackup"

# すべてのタスクをエクスポート
Get-ScheduledTask | ForEach-Object {
    $taskName = $_.TaskName
    Export-ScheduledTask -TaskName $taskName | Out-File "$backupPath\$taskName.xml"
}

# Gitに追加
Set-Location $backupPath
git add .
git commit -m "Automated backup of Scheduled Tasks on $(Get-Date -Format 'yyyy-MM-dd HH:mm')"
git push origin main

✅ このスクリプトのポイント

  • タスクをXML形式でエクスポート
  • Gitに追加し、変更があればコミット
  • GitHubなどのリモートリポジトリにプッシュ

💡 応用:
このスクリプトをScheduled Taskとして登録すれば、タスクの履歴管理を完全に自動化できます。


6. 変更差分を確認し、特定のバージョンを復元


過去のバージョンに戻す場合、Gitの履歴から特定のタスクを復元できます。

# 過去のコミット一覧を表示
git log --oneline

# 特定のバージョンに戻す(例: abc1234 のコミットに戻す)
git checkout abc1234 -- "C:\ScheduledTaskBackup\DailyBackup.xml"

# タスクを再登録
Register-ScheduledTask -TaskName "DailyBackup" -Xml (Get-Content "C:\ScheduledTaskBackup\DailyBackup.xml" -Raw) -User "SYSTEM"

✅ このスクリプトのポイント

  • git log --oneline で変更履歴を確認
  • git checkout を使い、特定のバージョンのXMLを復元
  • Register-ScheduledTask でタスクを再登録

まとめ

  • PowerShellスクリプトで複数のタスクを一括エクスポート・インポート可能
  • フォルダごとにタスクを分けて管理できる
  • Gitと組み合わせることで、履歴管理や復元が簡単にできる
  • スクリプトをScheduled Taskとして登録すれば、自動バックアップが可能

これで、大規模な環境でもScheduled Taskを効率的に管理できます!
次のセクションでは、まとめを紹介します。

まとめ

本記事では、PowerShellを活用したScheduled TaskのXML管理方法とバージョン管理について詳しく解説しました。

ポイントのおさらい

  • PowerShellを使った基本操作
  • Get-ScheduledTask で一覧取得
  • Register-ScheduledTask でタスクを作成
  • Export-ScheduledTask でタスクをXMLに保存
  • Scheduled TaskのXML管理
  • エクスポート (Export-ScheduledTask) でタスクのバックアップ
  • インポート (Register-ScheduledTask) で他の環境に適用
  • エクスポート・インポート時の注意点とエラー対策
  • XMLにはパスワード情報が含まれないため、ユーザー設定が必要
  • -User SYSTEM を指定することでエラーを回避
  • Gitを活用したバージョン管理
  • タスクを定期的にGitへバックアップし、変更履歴を追跡
  • 過去の設定に復元することで、誤変更やトラブルを防ぐ
  • スクリプトを活用した自動化
  • PowerShellスクリプトですべてのタスクをエクスポート&Gitに保存
  • Scheduled Taskとして登録し、自動でバックアップを取る

この手法を導入すれば、Scheduled Taskの変更履歴を簡単に追跡でき、環境間の設定同期が容易になります。
特に、複数のタスクを一括管理し、自動バックアップを設定すれば、運用負荷を大幅に軽減できます。


今後の活用例

  • 企業環境でのタスク管理(テスト環境・本番環境での設定統一)
  • タスクの設定変更履歴を監査(いつ、誰が変更したのかを明確化)
  • GitHubなどのリモートリポジトリと連携し、タスクの設定を一元管理

PowerShell + Gitを活用し、Scheduled Taskの管理を自動化しましょう!

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次