Конечно, сравнение файлов или содержимого файлов в Windows – это то, что вы делали все эти годы. Но не напрягает ли вас визуальное сопоставление файлов и содержимого в какой-то момент? К счастью, у вас есть возможность сравнивать объекты с помощью PowerShell так, как вы хотите, с помощью команды Compare-Object
.
В этом руководстве вы узнаете, как сравнивать объекты с помощью PowerShell, такие как файлы или содержимое файлов, при этом настраивая вывод.
Сэкономьте свои глаза и эффективно сравнивайте объекты!
Требования
В этом руководстве будет проведена практическая демонстрация, но вам понадобится компьютер с Windows и установленным PowerShell. В этом руководстве используется версия PowerShell 5.1.
Сравнение содержимого файлов
Представьте, что у вас есть два разных файла с одинаковым содержимым. Как вы узнаете, если оба файла содержат одинаковое содержимое? Запуск команды Get-Content
может быть решением. Команда Get-Content
извлекает содержимое файла из указанного местоположения.
Откройте PowerShell и выполните следующие команды, чтобы получить содержимое (Get-Content
) указанных файлов в переменные ($file1
и $file2
). Замените путь ниже на путь к выбранным вами файлам для сравнения.

Теперь выполните команду Compare-Object
ниже, чтобы сравнить содержимое $file
(-ReferenceObject
) с $file2
(-DifferenceObject
).
По умолчанию Compare-Object
не показывает значения, присутствующие в обеих переменных. В качестве решения добавьте параметр -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). |

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

Сравнение строк также работает аналогично сравнению содержимого файлов, где вы можете либо указать строки, либо использовать переменные для представления строк для сравнения. Имейте в виду, что команда
Compare-Object
сравнивает исходные строки, а не символы.
Сравнение списков файлов из разных местоположений
Теперь, когда вы знаете, как сравнивать содержимое файлов, почему бы не сравнить реальные файлы из разных местоположений? Сравнение списков файлов пригодится, когда у вас есть два разных сервера, где вы храните одну и ту же папку для службы, содержащей одни и те же файлы.
На этот раз вы будете использовать команду Get-ChildItem
, чтобы получить список файлов в папке для сравнения с другим списком файлов.
Запустите нижеприведенные команды, чтобы получить списки файлов из папок C:\Temp\Folder1\ и C:\Temp\Folder2\ и сохранить списки в переменных $Folder1List и $Folder2List.
Также вы можете использовать параметр
-Recurse
в командеGet-ChildItem
, чтобы рекурсивно извлечь список файлов в подпапках.

Сравнение объектов с помощью PowerShell по свойствам
Вы только что сравнили файлы в разных местах, но может быть, вы захотите добавить еще одну опцию для сравнения файлов по свойствам. И в этом примере вы будете сравнивать файлы по lastaccesstime.
Запустите следующие команды для сравнения файлов из разных папок ($Folder1 и $Folder2) по lastaccesstime.

Сравнение процессов и служб
Возможности команды Compare-Object
не ограничиваются только сравнением строк или содержимого файлов. Вы также можете сравнивать процессы, службы и так далее.
Возможно, вы хотите сравнить службы между двумя серверами. В этом случае вы можете сохранить службы в переменные и сравнить их.
Запустите следующие команды для сравнения служб между двумя разными серверами ($server1
и $server2
).

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

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

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

Заключение
В этом учебном пособии вы узнали основы того, как сравнивать объекты с помощью PowerShell различными способами, от содержимого файлов до пользователей в группах AD. Вы поняли, что командлет Compare-Object
является быстрым решением для сравнения файлов, служб, процессов и так далее.
Вы приобрели базовые знания по использованию командлета Compare-Object
. Теперь, почему бы вам не развить эти новые знания, изучив мощное сравнение массивов PowerShell?
Source:
https://adamtheautomator.com/compare-objects-with-powershell/