タスクスケジューラとは
Windows OSに標準で備わっている機能の一つで、ソフトウェアを特定の曜日や時間などに実行するよう予定を立てることができる機能です。今回は、このタスクスケジューラをPowershellを利用してタスクの登録や更新、削除、取得といった操作方法をまとめていきます。
\自身のスキルを向上するには技術書で!!/
月額¥980で技術書が読み放題!!
- ビジネススキルとマインド向上したい!!
- 決断や行動を先送りにしてしまう方!!
利用するコマンド
タスクスケジューラにスケジュールを登録したり、更新、削除、確認など用意されている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 | システムアカウント以外はパスワードを設定する |
-RunLevel | Highest : 最上位特権で実行 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_EVENT | 0 | 特定のイベントが発生した時にトリガーする |
TASK_TRIGGER_TIME | 1 | 特定の時刻にタスクをトリガーする |
TASK_TRIGGER_DAILY | 2 | 1日単位のスケジュールでタスクをトリガーする |
TASK_TRIGGER_WEEKLY | 3 | 毎週単位のスケジュールでタスクをトリガーする |
TASK_TRIGGER_MONTHLY | 4 | 毎月単位のスケジュールでタスクをトリガーする |
TASK_TRIGGER_MONTHLYDOW | 5 | 毎月の曜日単位のスケジュールでタスクをトリガーする |
TASK_TRIGGER_IDLE | 6 | PCがアイドル状態になった時にトリガーする |
TASK_TRIGGER_REGISTRATION | 7 | タスクが登録された時にトリガーする |
TASK_TRIGGER_BOOT | 8 | PC起動時にタスクをトリガーする |
TASK_TRIGGER_LOGON | 9 | 特定のユーザがログオンした時にトリガーする |
TASK_TRIGGER_SESSION_STATE_CHANGE | 11 | 特定のユーザセッションの状態が変更された時にトリガーする |
アクションの設定パラメータ
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 やコマンドプロンプトなどを利用することで効率的に管理することができますので、是非ご利用いただければと思います。