Сравнение объектов с помощью PowerShell (Пошаговое руководство)

Конечно, сравнение файлов или содержимого файлов в Windows – это то, что вы делали все эти годы. Но не напрягает ли вас визуальное сопоставление файлов и содержимого в какой-то момент? К счастью, у вас есть возможность сравнивать объекты с помощью PowerShell так, как вы хотите, с помощью команды Compare-Object.

В этом руководстве вы узнаете, как сравнивать объекты с помощью PowerShell, такие как файлы или содержимое файлов, при этом настраивая вывод.

Сэкономьте свои глаза и эффективно сравнивайте объекты!

Требования

В этом руководстве будет проведена практическая демонстрация, но вам понадобится компьютер с Windows и установленным PowerShell. В этом руководстве используется версия PowerShell 5.1.

Сравнение содержимого файлов

Представьте, что у вас есть два разных файла с одинаковым содержимым. Как вы узнаете, если оба файла содержат одинаковое содержимое? Запуск команды Get-Content может быть решением. Команда Get-Content извлекает содержимое файла из указанного местоположения.

Откройте PowerShell и выполните следующие команды, чтобы получить содержимое (Get-Content) указанных файлов в переменные ($file1 и $file2). Замените путь ниже на путь к выбранным вами файлам для сравнения.

# Получить содержимое текстовых файлов в переменные
$file1 = Get-Content C:\\Temp\\File1.txt
$file2 = Get-Content C:\\Temp\\File2.txt
Storing Text File Contents to PowerShell Variables

Теперь выполните команду Compare-Object ниже, чтобы сравнить содержимое $file (-ReferenceObject) с $file2 (-DifferenceObject).

По умолчанию Compare-Object не показывает значения, присутствующие в обеих переменных. В качестве решения добавьте параметр -IncludeEqual, чтобы показать значения в выводе.

Compare-Object -ReferenceObject $file1 -DifferenceObject $file2 -IncludeEqual

Из вывода ниже SideIndicator указывает, имеют ли оба файла одинаковое содержимое (по строкам) или нет:

SideIndicator Definition
== Indicates the content is present in both files ($file1 and $file2).
=> Indicates the content only exists in the -DifferenceObject file ($file2).
=> Indicates the content only exists in the -ReferenceObject file ($file1).
Comparing File Contents

Возможно, вы предпочитаете сравнивать строки с учетом регистра. Если это так, добавьте параметр -CaseSensitive, поскольку команда Compare-Object по умолчанию не учитывает регистр.

Выполните следующие команды, чтобы сравнить $file1 с $file2, как с учетом регистра, так и без него.

# Сравнение содержимого файлов с параметром -CaseSensitive
Compare-Object $file1 $file2 -CaseSensitive
# Сравнение содержимого файлов без параметра -CaseSensitive
Compare-Object $file1 $file2

Как видно ниже, без параметра -CaseSensitive команда Compare-Object не показывает powershell в выводе.

Compare Objects wth PowerShell : Comparing File Contents with Case Sensitivity

Сравнение строк также работает аналогично сравнению содержимого файлов, где вы можете либо указать строки, либо использовать переменные для представления строк для сравнения. Имейте в виду, что команда Compare-Object сравнивает исходные строки, а не символы.

Сравнение списков файлов из разных местоположений

Теперь, когда вы знаете, как сравнивать содержимое файлов, почему бы не сравнить реальные файлы из разных местоположений? Сравнение списков файлов пригодится, когда у вас есть два разных сервера, где вы храните одну и ту же папку для службы, содержащей одни и те же файлы.

На этот раз вы будете использовать команду Get-ChildItem, чтобы получить список файлов в папке для сравнения с другим списком файлов.

Запустите нижеприведенные команды, чтобы получить списки файлов из папок C:\Temp\Folder1\ и C:\Temp\Folder2\ и сохранить списки в переменных $Folder1List и $Folder2List.

# Захват списка имен файлов в переменные
$Folder1List = Get-ChildItem C:\\Temp\\Folder1\\
$Folder2List = Get-ChildItem C:\\Temp\\Folder2\\
# Сравнение списков
Compare-Object $Folder1List $Folder2List -IncludeEqual

Также вы можете использовать параметр -Recurse в команде Get-ChildItem, чтобы рекурсивно извлечь список файлов в подпапках.

Comparing Files in Different Folders

Сравнение объектов с помощью PowerShell по свойствам

Вы только что сравнили файлы в разных местах, но может быть, вы захотите добавить еще одну опцию для сравнения файлов по свойствам. И в этом примере вы будете сравнивать файлы по lastaccesstime.

Запустите следующие команды для сравнения файлов из разных папок ($Folder1 и $Folder2) по lastaccesstime.

# Получить список файлов из указанных файлов
$Folder1 = Get-ChildItem C:\\Temp\\Folder1\\ -Recurse
$Folder2 = Get-ChildItem C:\\Temp\\Folder2\\ -Recurse
# Сравнить файлы по lasttimeaccess с именами файлов
Compare-Object $Folder1 $Folder2 -Property name,lastaccesstime
Listing Compared Files using the lastaccesstime Parameter

Сравнение процессов и служб

Возможности команды Compare-Object не ограничиваются только сравнением строк или содержимого файлов. Вы также можете сравнивать процессы, службы и так далее.

Возможно, вы хотите сравнить службы между двумя серверами. В этом случае вы можете сохранить службы в переменные и сравнить их.

Запустите следующие команды для сравнения служб между двумя разными серверами ($server1 и $server2).

# Сохранить список служб в переменные
$server1 = Get-Service -ComputerName jumpbox
$server2 = Get-Service -ComputerName AD
# Сравнить службы на обоих серверах и отсортировать их по имени службы
Compare-Object $server1 $server2 -PassThru | sort name| select name,status,machinename
Comparing Services Between Two Servers

Если вы предпочитаете сравнивать процессы, команды для выполнения аналогичны сравнению служб. Вы также можете сравнивать процессы на одной машине или двух разных серверах.

Запустите следующие команды для сохранения списка работающих процессов с двух машин (Jumpbox и серверов AD) в переменные и их сравнения.

# Получение списка процессов с удаленных серверов в переменные PowerShell
$server1Process = Get-Process -ComputerName Jumpbox
$server2Process = Get-Process -ComputerName AD
# Сравнение процессов с двух серверов и перечисление имен процессов и соответствующего им имени сервера в выводе
Compare-Object $server1Process $server2Process -PassThru | sort name  |select name,machinename,sideindicator
Comparing Processes Between Two Servers

Выявление действий путем сравнения списков процессов

Команда Compare-Object также полезна в некоторых сценариях устранения неполадок. Как? Вы можете захватить текущие запущенные процессы в переменную и начать вашу деятельность. Затем вы захватите запущенные процессы в новую переменную и сравните новые процессы.

Выполните нижеприведенные команды, чтобы выявить действия, сравнив два различных списка захваченных процессов.

# Захват процессов перед началом вашей деятельности.
$Initial_Process = Get-Process
# Откройте блокнот (ваша деятельность)
notepad
# Захват процессов после завершения вашей деятельности.
$New_Process = Get-Process
# Сравнение начального и нового процесса
Compare-Object $Initial_Process $New_Process -PassThru | select processname,sideindicator
Identifying New Processes on Local PC

Сравнение пользователей между разными группами активного каталога

Если вы управляете одним и тем же набором пользователей из разных групп AD, сравнение списка пользователей с помощью команды Compare-Object будет полезно. Это позволяет вам тщательно следить, если пользователь отсутствует в одной из двух разных групп AD.

Выполните нижеприведенные команды для сравнения пользователей между двумя разными группами AD (staticvmusers и vdivmusers).

# Импортируйте модуль Active Directory для выполнения команд Get-ADGroup и Get-ADUser.
Import-Module ActiveDirectory
# Сохраните список пользователей из различных групп AD в переменные.
$FirstGroup = Get-ADGroup staticvmusers -Properties Member |Select-Object -ExpandProperty Member | Get-ADUser
$SecondGroup = Get-ADGroup vdivmusers -Properties Member |Select-Object -ExpandProperty Member | Get-ADUser
# Запустите командлет compare-object для сравнения пользователей в этих двух группах AD.
Compare-Object ($FirstGroup) ($SecondGroup) -Property 'SamAccountName' -IncludeEqual
Comparing Users in Two AD Groups

Заключение

В этом учебном пособии вы узнали основы того, как сравнивать объекты с помощью PowerShell различными способами, от содержимого файлов до пользователей в группах AD. Вы поняли, что командлет Compare-Object является быстрым решением для сравнения файлов, служб, процессов и так далее.

Вы приобрели базовые знания по использованию командлета Compare-Object. Теперь, почему бы вам не развить эти новые знания, изучив мощное сравнение массивов PowerShell?

Source:
https://adamtheautomator.com/compare-objects-with-powershell/