チェックディスクのイベントログをボリュームラベルで分類して取得する方法です。
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text.RegularExpressions; const int CheckDiskInstanceID = 0x400003e9; // ボリュームラベルの正規表現 var re_volume = new Regex("^\r\n\r\nChecking file system on (?<VolumeLabel>\\S?):\r\n"); var log = new EventLog("Application", ".", "Wininit"); var entries = log.Entries.Cast<EventLogEntry>() .Where(entry => entry.InstanceId == CheckDiskInstanceID); // ボリュームラベルとエントリーの辞書 var dict = new Dictionary<char, List<EventLogEntry>>(); foreach (var entry in entries) { var m = re_volume.Match(entry.Message); if (m.Success) { var key = m.Groups["VolumeLabel"].Value[0]; if (!dict.ContainsKey(key)) { dict.Add(key, new ()); } dict[key].Add(entry); } } // TODO: ここでボリュームラベルとエントリーの辞書を処理します。 // ここでは作成日時が最新の情報を一覧表示します。 foreach (var key in dict.Keys.OrderBy(key => key)) { Console.WriteLine(dict[key].OrderByDescending( entry => entry.TimeGenerated).First().Message); }
2021/3/10:この記事は別のブログで投稿した記事を移動したものです。