タスクスケジューラの履歴情報をバッチまたはPowerShellスクリプト内の配列または変数に取得する方法はありますか?.
たとえば、タスク名、タスクが開始された日時(イベントID:100)、タスクが完了した日時(イベントID:102)などの情報を取得します。これは、SQLデータベースをその情報で更新できるようにするためです。 (SQLテーブルは次のようになります。情報を取得したらデータベースに挿入する方法を知っています)
TaskName TaskStart TaskCompleted
task1 27/09/2017 09:00:00 27/09/2017 10:00:00
task2 27/09/2017 12:00:00 27/09/2017 16:00:00
task1 04/10/2017 09:00:00 04/09/2017 09:55:00
基本的に、可能であれば、その情報を取得する方法はわかりません。ありがとう
タスクスケジューラは、次のイベントチャネルにログを記録します。Microsoft-Windows-TaskScheduler/Operational
Get-WinEvent
を使用してイベントを収集できます。 id 100
開始イベントのフィルターハッシュテーブルを定義することから始めます
# Event filter for the initial query for all "Start" events in the last 24 hours
$EventFilter = @{
LogName = 'Microsoft-Windows-TaskScheduler/Operational'
Id = 100
StartTime = [datetime]::Now.AddDays(-1)
}
相関する完了イベントを見つけるために、開始イベントからいくつかのプロパティ値を抽出する必要があるので、プロパティセレクターを作成しましょう
# PropertySelector for the Correlation id (the InstanceId) and task name
[string[]]$PropertyQueries = @(
'Event/EventData/Data[@Name="InstanceId"]'
'Event/EventData/Data[@Name="TaskName"]'
)
$PropertySelector = New-Object System.Diagnostics.Eventing.Reader.EventLogPropertySelector @(,$PropertyQueries)
次に、開始イベントを取得し、対応する完了イベントを見つけて、その情報を新しいカスタムオブジェクトとして出力します。
# Loop through the start events
$TaskInvocations = foreach($StartEvent in Get-WinEvent -FilterHashtable $EventFilter){
# Grab the InstanceId and Task Name from the start event
$InstanceId,$TaskName = $StartEvent.GetPropertyValues($PropertySelector)
# Create custom object with the name and start event, query end event by InstanceId
[pscustomobject]@{
TaskName = $TaskName
StartTime = $StartEvent.TimeCreated
EndTime = $(Get-WinEvent -FilterXPath "*[System[(EventID=102)] and EventData[Data[@Name=""InstanceId""] and Data=""{$InstanceId}""]]" -LogName 'Microsoft-Windows-TaskScheduler/Operational' -ErrorAction SilentlyContinue).TimeCreated
}
}
DataTable
に$TaskInvocations
内のオブジェクトを入力するか、プロパティ値に基づいて挿入クエリを生成できます。
バッチであなたはそのようなことをすることができます:
@echo off
SCHTASKS /Query /FO Table > Tasks.txt
Start "" Tasks.txt
または、PowerShellでこの回答を確認できます:PowerShellを使用してスケジュールされたタスクのインベントリを作成する方法