Powershellでタスクスケジューラを作成して実行してみた

Powershell Powershell
この記事は約9分で読めます。

Powershellのコマンドでタスクスケジューラを作成して実行してみました。

広告

1.Powershellでタスクスケジューラを作成する

Set-ScheduledTaskAction を利用して作成可能です。

今回は午前2時powershellスクリプトを実行させます。
スクリプトが実行されると特定のフォルダに test.txt を作成します。

$task_name = "TestTask"

# トリガーの定義
$trigger = New-ScheduledTaskTrigger -Daily -At 2am

# アクションの定義
$action = New-ScheduledTaskAction -Execute "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" `
 -Argument '-Executionpolicy Bypass -File "C:\task\test.ps1"' `
 -WorkingDirectory "C:\task"

# タスクスケジューラを作成
Register-ScheduledTask -TaskName $task_name `
 -Trigger $trigger `
 -Action $action `
 -Description "This is a Test task created by PowerShell." `
 -RunLevel Highest

# 作成後の確認
Get-ScheduledTask -TaskPath "\"

Powershellスクリプト

利用するスクリプトは以下の内容で準備します。

# 作成するテキストファイルのパスを指定
$filepath = "C:\task\test.txt"

# テキスト内容を配列として定義
$content = @(
    "テストファイル:1行目",
    "テストファイル:2行目"
)

# テキストファイルを作成し、内容を書き込む
$content | Out-File -FilePath $filepath -Encoding UTF8

2.Powershellでタスクスケジューラを実行する

Start-ScheduledTask を利用して実行可能です。

実行結果は出力はされませんが、今回はテキストファイルが確認できればOKです。

# タスクスケジューラを実行する
Start-ScheduledTask -TaskName $task_name

3.実行履歴を確認する

以下のコマンドで実行履歴を確認できます。

# ログを有効化する
$log = Get-WinEvent -ListLog Microsoft-Windows-TaskScheduler/Operational
$log.IsEnabled = $true
$log.SaveChanges()

# ログを確認する
$task = Get-ScheduledTask -TaskName $task_name
$logName = "Microsoft-Windows-TaskScheduler/Operational"
$event = Get-WinEvent -LogName $logName | Where-Object { $_.Message -like "*$task_name*" }
$event | Format-List -Property TimeCreated, Id, LevelDisplayName, Message

実行結果

PS C:\> $event = Get-WinEvent -LogName $logName | Where-Object { $_.Message -like "*$task_name*" }
PS C:\> $event | Format-List -Property TimeCreated, Id, LevelDisplayName, Message


TimeCreated      : 2025/02/26 13:43:36
Id               : 102
LevelDisplayName : 情報
Message          : タスク スケジューラは、ユーザー "test-vm\xxxxxxx" の "\TestTask" タスクの "{591a38c9-1775-4dbd-b
                   c46-6c90bac19f0c}" インスタンスを正常に完了しました。

TimeCreated      : 2025/02/26 13:43:36
Id               : 201
LevelDisplayName : 情報
Message          : タスク スケジューラは、タスク "\TestTask"、インスタンス "{591a38c9-1775-4dbd-bc46-6c90bac19f0c}"、操
                   作 "PowerShell.exe" を正常に完了しました。リターン コード: 4294770688

TimeCreated      : 2025/02/26 13:43:35
Id               : 200
LevelDisplayName : 情報
Message          : タスク スケジューラは、タスク "\TestTask" のインスタンス "{591a38c9-1775-4dbd-bc46-6c90bac19f0c}" で
                   操作 "PowerShell.exe" を開始しました。

TimeCreated      : 2025/02/26 13:43:35
Id               : 100
LevelDisplayName : 情報
Message          : タスク スケジューラは、ユーザー "test-vm\xxxxxxx" の "\TestTask" タスクの "{591a38c9-1775-4dbd-b
                   c46-6c90bac19f0c}" インスタンスを開始しました。

TimeCreated      : 2025/02/26 13:43:35
Id               : 129
LevelDisplayName : 情報
Message          : タスク スケジューラは、プロセス ID 2516 でタスク "\TestTask"、インスタンス "PowerShell.exe" を起動し
                   ました。

TimeCreated      : 2025/02/26 13:43:35
Id               : 110
LevelDisplayName : 情報
Message          : タスク スケジューラは、ユーザー "hogeuser" のタスク "\TestTask" の "{591a38c9-1775-4dbd-bc46-6c90bac
                   19f0c}" インスタンスを起動しました。

TimeCreated      : 2025/02/26 13:43:35
Id               : 325
LevelDisplayName : 警告
Message          : タスク スケジューラは、タスク "\TestTask" のインスタンス "{591a38c9-1775-4dbd-bc46-6c90bac19f0c}" を
                   キューに入れました。



PS C:\>

[参考] ログの有効化をしないとエラーが出る

ログは有効化しないと以下のエラーが出ます。

PS C:\> $events = Get-WinEvent -LogName $logName | Where-Object { $_.Message -like "*$task_name*" }
Get-WinEvent : 指定した選択条件に一致するイベントが見つかりませんでした。
発生場所 行:1 文字:11
+ $events = Get-WinEvent -LogName $logName | Where-Object { $_.Message  ...
+           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (:) [Get-WinEvent], Exception
    + FullyQualifiedErrorId : NoMatchingEventsFound,Microsoft.PowerShell.Commands.GetWinEventCommand

4.タスクを削除する

Get-ScheduledTask でタスクを削除可能です。

# タスクを削除する
Unregister-ScheduledTask -TaskName $task_name

# 削除後の確認
Get-ScheduledTask -TaskPath "\"

[参考] Powershellでタスク一覧を取得する

Get-ScheduledTask でタスク一覧を取得することが可能です。

オプションをつけることで特定のパスのタスクのみを表示させることもできます。

タスクスケジューラはデフォルトだと \ に作成されるので、オプションを利用して \ のみ表示するコマンドを多用するかと思います。

# すべてのタスクを出力
Get-ScheduledTask

# 特定のパスのタスクのみ出力(推奨)
Get-ScheduledTask -TaskPath "\"

実行結果

以下のように \ 配下のタスクのみ表示できます。

PS C:\> Get-ScheduledTask -TaskPath "\"

TaskPath                                       TaskName                          State
--------                                       --------                          -----
\                                              MicrosoftEdgeUpdateTaskMachine... Ready
\                                              MicrosoftEdgeUpdateTaskMachine... Ready
\                                              TestTask                          Ready


PS C:\>
P
タイトルとURLをコピーしました