[PowerShell] タスクスケジューラへのスケジュール登録・更新・削除・確認など操作方法まとめ

タスクスケジューラとは

Windows OSに標準で備わっている機能の一つで、ソフトウェアを特定の曜日や時間などに実行するよう予定を立てることができる機能です。今回は、このタスクスケジューラをPowershellを利用してタスクの登録や更新、削除、取得といった操作方法をまとめていきます。

\自身のスキルを向上するには技術書で!!/

月額¥980で技術書が読み放題!!

  • ビジネススキルとマインド向上したい!!
  • 決断や行動を先送りにしてしまう方!!

Kindle Unlimitedでは30日間無料体験実施中!登録はこちら!

利用するコマンド

タスクスケジューラにスケジュールを登録したり、更新、削除、確認など用意されているCmdletは下記の通りです

Cmdlet説明
New-ScheduledTaskTrigger実行スケジュールを作成するCmdlet
New-ScheduledTaskAction実行内容を作成するCmdlet
New-ScheduledTaskSettingsSetスケジュールの細かい設定を作成するCmdlet
(必須ではないので必要に応じて設定する)
Register-ScheduledTask定義した内容をタスクスケジューラに登録するCmdlet
Enable-ScheduledTask登録済みのタスクを有効化するCmdlet
Disable-ScheduledTask登録済みのタスクを無効化するCmdlet
Start-ScheduledTask登録済みのタスクを実行するCmdlet
Stop-ScheduledTask実行中のタスクを停止するCmdlet
Unregister-ScheduledTask登録済みのタスクを削除するCmdlet
Get-ScheduledTask登録済みのタスクを取得するCmdlet
Set-ScheduledTask登録済みのタスクを編集するCmdlet
Export-ScheduledTask登録済みのタスクをエクスポートするCmdlet

他にも Get-ClusteredScheduledTask や New-ScheduledTaskPrincipal などありますが、ここでは割愛します。上記Cmdletを覚えておくだけで基本的にタスクスケジューラへの操作は可能です。

タスクスケジューラに登録済みのタスクを取得する

登録済みのタスクを取得する場合は「Get-ScheduledTask」Cmdletを利用します。

PS C:\WINDOWS\system32> Get-ScheculedTask

TaskPath                                TaskName                                                 State     
------------                               --------------                                                ----------     
\                                              Adobe Acrobat Update Task                  Ready     
\                                              GoogleUpdateTaskMachineCore            Ready     
\                                              GoogleUpdateTaskMachineCore1d7...  Running   
\                                              GoogleUpdateTaskMachineUA               Ready     
\                                              MicrosoftEdgeUpdateTaskMachine...    Ready    
・・・・

上記のように、現在登録されているタスクの一覧を取得することができます。

加えて、「-TaskName」パラメータを指定することで、登録済みのタスクを指定して取得することもできます。

PS C:\WINDOWS\system32> Get-ScheduledTask -TaskName 'Adobe Acrobat Update Task'

TaskPath                                TaskName                                                 State     
------------                               --------------                                                ----------     
\                                              Adobe Acrobat Update Task                  Ready     

タスクスケジューラにタスクを登録する

タスクスケジューラにタスクを登録するためには、「Register-ScheduledTask」Cmdletを利用します。以下のパラメータを利用して登録を行います。

パラメータ説明
-TaskPathタスクスケジューラで管理するタスクの階層を指定する
-TaskNameタスク名を指定する
-User実行アカウントを指定する
-Passwordシステムアカウント以外はパスワードを設定する
-RunLevelHighest : 最上位特権で実行
Limited: 限定実行
-Triggerトリガー設定(New-ScheduledTaskTriggerで作成したトリガー設定情報)
-Action操作の設定(New-ScheduledTaskActionで作成した操作設定情報)
-Settings条件の設定(任意で設定)(New-ScheduledTaskSettingsSetで作成した条件情報)
# 午前10時に1回のみ実行
$Trigger = New-ScheduledTaskTrigger -Once -At 10:00

# コマンドプロンプトを起動
$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-Command Write-Host Hello!!"

# 30分以内にタスクが終了していない場合は自動でタスクを停止する
$Settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 30)

# タスクスケジューラに「Sample Task」として登録
Register-ScheduledTask -TaskPath "\" -TaskName "Sample Task" -User "SYSTEM" -RunLevel Highest -Trigger $Trigger -Action $Action -Settings $Settings

タスクスケジューラにタスクを登録する場合は、トリガー情報(実行頻度の設定)と操作情報(何を実行するのか)を事前に用意しておき、Register-ScheduledTask Cmdletのパラメータにそれぞれ渡してあげます。

条件設定については、任意で設定します。

トリガーの設定パラメータ

New-ScheduledTaskTriggerを使って設定するトリガー情報の代表的なパラメータについては下記の通りです。詳細は「Microsoft Learn – New-ScheduledTaskTrigger」を参照

# 一回のみ実行する
New-ScheduledTaskTrigger -Once -At "10:00"

# 10分毎に実行する(継続時間:無期限)
New-ScheduledTaskTrigger -Once -At "00:00:00" -RepetitionInterval "00:10:00" -RepetitionDuration ([timespan]::MaxValue)

# 毎日10時に実行する
New-ScheduledTaskTrigger -Daily -At "10:00"

# 毎週日曜日の10時に実行する
New-ScheduledTaskTrigger -Weekly -DaysOfWeek "Sunday" -At "10:00"
タスクスケジューラ(新規トリガー画面)

上記で設定する情報はすべて設定可能ですが、毎月実行というようなスケジュールを組みたい場合は「-Monthly」のようなパラメータが存在しないため、下記のようにタスクを作成します。(COMオブジェクトを利用してタスクスケジューラにアクセスし、タスクを作成。

$service = new-object -comobject Schedule.Service
$service.connect()
$rootFolder = $service.GetFolder("\")
$taskdefinitiion = $service.NewTask(0)
$taskdefinitiion.Settings.Enabled = $true

# 毎月1日にトリガー
$triggers = $taskDefinition.Triggers
$trigger = triggers.Create(4)
$trigger.DaysOfMonth = 1
$trigger.Enabled = $true

# Powershellスクリプトを実行する
$TaskScript = "C:\scripts\myscript.ps1"
$action = $TaskDefinition.Actions.Create(0)
$action.Path = "c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe"
$action.Arguments = "-WindowStyle Hidden -NonInteractive -Executionpolicy unrestricted -file $TaskScript"

# タスク登録
$rootFolder.RegisterTaskDefinition("$TaskName",$TaskDefinition,6,"System",$null,5)
トリガータイプ設定値説明
TASK_TRIGGER_EVENT0特定のイベントが発生した時にトリガーする
TASK_TRIGGER_TIME1特定の時刻にタスクをトリガーする
TASK_TRIGGER_DAILY21日単位のスケジュールでタスクをトリガーする
TASK_TRIGGER_WEEKLY3毎週単位のスケジュールでタスクをトリガーする
TASK_TRIGGER_MONTHLY4毎月単位のスケジュールでタスクをトリガーする
TASK_TRIGGER_MONTHLYDOW5毎月の曜日単位のスケジュールでタスクをトリガーする
TASK_TRIGGER_IDLE6PCがアイドル状態になった時にトリガーする
TASK_TRIGGER_REGISTRATION7タスクが登録された時にトリガーする
TASK_TRIGGER_BOOT8PC起動時にタスクをトリガーする
TASK_TRIGGER_LOGON9特定のユーザがログオンした時にトリガーする
TASK_TRIGGER_SESSION_STATE_CHANGE11特定のユーザセッションの状態が変更された時にトリガーする

アクションの設定パラメータ

New-ScheduledTaskActionを使って操作に関する設定を行います。

パラメータに関する詳しい情報は「New-ScheduledTaskAction – Microsoft Learn」を参照。

基本的に利用するパラメータは下記の通りです。

パラメータ説明
-Execute実行するプログラムのファイルパス
-Arguments実行プログラムに加える引数
$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-Command Write-Host Hello!!"

登録済みのタスクを更新

タスクの更新を行う場合は、「Set-ScheduledTask」Cmdletを利用します。

利用する引数は登録時とほぼ同じとなります。

下記は、登録されている内容を変更するサンプルとなります。

# 午前11時に1回のみ実行 (10時に登録してあるタスクを11時に変更)
$Trigger = New-ScheduledTaskTrigger -Once -At 11:00

# Powershellを起動し、標準出力で出力
$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-Command Write-Host Hello!! Edit!"

# 45分以内にタスクが終了していない場合は自動でタスクを停止する
$Settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 45)

# タスクスケジューラに「Sample Task」として登録
Set-ScheduledTask -TaskPath "\" -TaskName "Sample Task" -Trigger $Trigger -Action $Action -Settings $Settings

タスクスケジューラから登録済みのタスクを削除

タスクを削除するには「Unregister-ScheduledTask」Cmdletを実行します。

ただし、なにも指定せず実行するとOSに最初から登録済みのタスクも削除されてしまいますので注意が必要です。登録済みのタスクを削除する場合は、一度Get-ScheduledTask で該当のタスクを取得後にパイプラインで繋いで削除する必要があります。

Get-ScheduledTask -TaskName "MyScheduledTask" | Unregister-ScheduledTask

上記を実行すると下記のようなダイアログが表示されます。

確認ダイアログを表示せず、無条件で削除したい場合は「-Confirm:$false」をパラメータに指定すると、ダイアログが表示されなくなります。

Get-ScheduledTask -TaskName "MyScheduledTask" | Unregister-ScheduledTask -Confirm:$false

タスクスケジューラに登録済みタスクの有効化と無効化

有効化する場合は「Enable-ScheduledTask」Cmdletを利用し、無効化する場合は「Disable-ScheduledTask」Cmdletを利用します。

# MyScheduledTaskという登録済みタスクの有効化
Get-ScheduledTask -TaskName "MyScheduledTask" | Enable-ScheduledTask

# MyScheduledTaskという登録済みタスクの無効化
Get-ScheduledTask -TaskName "MyScheduledTask" | Disable-ScheduledTask

すでに実行中のタスクの停止および停止中のタスクの実行

すでに実行中のタスクを停止する場合は「Stop-ScheduledTask」Cmdletを利用します。こちらを利用する場合は、対象のタスクを「Get-ScheduledTask」Cmdletで当該タスクを取得し、パイプラインで繋いで実行します。

Get-ScheduledTask -TaskName "MyScheduledTask" | Stop-ScheduledTask

逆に、停止しているタスクを実行する場合は「Start-ScheduledTask」Cmdletを利用します。こちらも停止する場合と同様に「Get-ScheduledTask」Cmdletで当該タスクを取得し、パイプラインで繋いで実行します。

Get-ScheduledTask -TaskName "MyScheduledTask" | Start-ScheduledTask

最後に

タスクスケジューラはWindows OSに対してかなり有用な機能です。

この機能をPowershell やコマンドプロンプトなどを利用することで効率的に管理することができますので、是非ご利用いただければと思います。

タイトルとURLをコピーしました