How can I parse SoftwareDistribution.log and count unique client IDs?

September 21, 2026 2 answers
Asked by MellowPine42
I'm troubleshooting WSUS errors and need a PowerShell script that can parse SoftwareDistribution.log, extract the Client GUID from entries like `Client=13ef38ff-b877-4d9a-9b1e-cf190d8fc801`, and group or count the results. The goal is to identify how many machines are experiencing this issue. Ideally, the parser could also expose fields such as the error code, message, timestamp, severity, and actor.

Answers

CopperLynx7
You can match the overall log format, split the comma-separated key/value section, and turn each line into an object. That gives you properties you can filter, group, and count later: ```powershell $regex = @' (?xm)^ (?S+sS+sUTCs) (?w+)s (?.*?:)s (?.*) $' '@ $logs = foreach ($line in Get-Content 'C:PathSoftwareDistribution.log') { if ($line -match $regex) { $props = [ordered]@{} $Matches.Pairs -split 's*,s*' | ForEach-Object { $key,$value = $_ -split 's*=s*',2 $props[$key] = $value } [pscustomobject]@{ Error = $props.ErrorCode Message = $props.Message Actor = $props.Actor Client = $props.Client Date = $Matches.DateTime Severity = $Matches.Severity Exception = $Matches.Exception } } } $logs | Group-Object Client | Sort-Object Count -Descending ``` The resulting objects can also be filtered by `Error`, `Message`, or `Severity` before grouping.

BrightOak18: Since the regular expression is already doing the line matching, you can also use a `switch -Regex -File` loop instead of manually iterating over `Get-Content`. The key part remains splitting the captured pairs with `-split 's*,s*'` and then splitting each pair only on its first equals sign.

Reply to this answer
QuietOrbit63
If all you need is the client identifier, a much smaller parser is enough: ```powershell $clients = foreach ($line in Get-Content 'C:PathSoftwareDistribution.log') { if ($line -match 'Client=(?[^,s]+)') { $Matches.Client } } $clients | Group-Object | Sort-Object Count -Descending ``` That extracts the value after `Client=` up to the next comma or whitespace, then groups identical IDs and shows how often each one appears. Use `($clients | Sort-Object -Unique).Count` if you only need the number of distinct clients.

SilverMaple29: This pattern only returns lines that actually contain a `Client=` field, which is intentional. Each captured value is emitted into `$clients`, so `Group-Object` can count the occurrences and identify the affected machines.

Reply to this answer

Add your answer

Answers are reviewed before publication.

Related Discussions