Hands up if you’ve tried to compare 2 objects of some type to see what – if any – differences there are between them?
I tried and gave up. PowerShell’s native “Compare-Object” isn’t very helpful. It will tell you IF there’s a difference, but it’s not particularly forthcoming.
Borne of that experience comes “Compare-Objects.ps1”. You might see some similarities here with two of my other scripts (Compare-PkiCertificates & Update-SfbCertificate.ps1) as the comparison engine is essentially the same between them.
Feed this script the “type” of the object and the names of two of them, and it will present a tabular comparison, highlighting all those attributes that differ.
All of these formats are valid input examples:
Compare-Objects.ps1 –type csuser –object1 “greig” –object2 “jessica” Compare-Objects.ps1 –type csuser –object1 greig –object2 jessica Compare-Objects.ps1 get-csuser greig jessica
Armed with the above input the script performs two “get-” commands to query the objects, then feeds the results into the differencing engine. The “get-” is implied in the command-line input, and the script will cope fine if you absent-mindedly include it, like in the last example above.
For more information add the “-verbose” switch, and if you don’t want it querying my blog in search of an update, use “-SkipUpdateCheck”.
One of my earliest requirements was to compare client policies in Skype for Business. Here’s the script doing that for me, condensing 86 attributes down to the 4 that differ:
PS: C:\>.\Compare-Objects.ps1 csclientpolicy Hotdesking SkypeUI -Verbose
PS: C:\>.\Compare-Objects.ps1 csuser greig jessica
… even Disks:
PS:>.\Compare-Objects.ps1 -Type disk 0 1 -Verbose
If you encounter any object types or attributes that report errors, please let me know in the comments here and I’ll do my best to cater for them.
I will admit to drawing a blank with a couple of Exchange attributes, as you can see from the errors thrown when I compare two mailbox databases:
The Wheel, reinvented
In the process of writing this post I stumbled upon Jamie Nelson’s post on the TechNet blog “Compare all properties of two objects in Windows PowerShell”, in which he provides a neat function in 22 lines of code that basically does all of the above. Yes, I cursed a little at that belated finding, but kudos Jamie for stepping into the breach.
You’ll find the code-signed script available to download at the PowerShell Gallery.
It has an update checking component built-in so it will let you know as updates become available. You can suppress the update check by running it with the “-SkipUpdateCheck” parameter.
v1.0 – 5th May 2018. This is the initial release.