Назад | Перейти на главную страницу

Сравнение двух конкретных свойств CSV с помощью Compare-Object не дает ожидаемых результатов

У меня есть список пользователей из двух разных доменов. Эти списки находятся в формате CSV, и меня интересует только SAMAccountName, которое является полем в этих CSV.

Код, с которым я работаю в настоящее время:

$domain1 = Import-CSV C:\Scripts\Temp\domain1.xxx.org.csv | Select-Object SAMAccountName
$domain2 = Import-CSV C:\Scripts\Temp\domain2.xxx.org.csv | Select-Object SAMAccountName

Compare-Object ($domain1) ($domain2)

Это возвращает только несколько результатов (которые неточны) в этом формате:

@{samaccountname=SomeUser}                                       =>

Очевидно, что Compare-Object не оценивает объекты как строки. Как мне заставить это работать?

Для примера CSV-файла "domain1.xxx.org.csv" с содержанием как:

"name","samaccountname","description","distinguishedname","enabled","lastlogondate" 
"ADAUser01","ADAUser01",,"CN=ADAUser01,OU=Users,OU=ADA,DC=phl,DC=xxx,DC=ORG","True","8/7/2012 2:28:37 PM"

Мы видим, как Import-Csv преобразует текст в PSCustomObject, используя заголовки:

Import-Csv domain1.xxx.org.csv | Select-Object -First 1 | Get-Member

   TypeName: Selected.System.Management.Automation.PSCustomObject

Name              MemberType   Definition
----              ----------   ----------
Equals            Method       bool Equals(System.Object obj)
GetHashCode       Method       int GetHashCode()
GetType           Method       type GetType()
ToString          Method       string ToString()
description       NoteProperty System.String description=
distinguishedname NoteProperty System.String distinguishedname=CN=ADAUser01,OU=Users,OU=ADA,DC=phl,DC=xxx,DC=ORG
enabled           NoteProperty System.String enabled=True
lastlogondate     NoteProperty System.String lastlogondate=8/7/2012 2:28:37 PM
name              NoteProperty System.String name=ADAUser01
samaccountname    NoteProperty System.String samaccountname=ADAUser01

Фильтрация через Select-Object SAMAccountName приводит к следующему:

Import-Csv domain1.xxx.org.csv | Select-Object -First 1 SamAccountName

   TypeName: Selected.System.Management.Automation.PSCustomObject

Name           MemberType   Definition
----           ----------   ----------
Equals         Method       bool Equals(System.Object obj)
GetHashCode    Method       int GetHashCode()
GetType        Method       type GetType()
ToString       Method       string ToString()
samaccountname NoteProperty System.String samaccountname=ADAUser01

Если вы хотите сравнить NoteProperty между двумя объектами PSCustomObject, потому что мы не просто оцениваем String, вам просто нужно указать Compare-Object с какой недвижимостью вы хотите сравнить:

Compare-Object $domain1 $domain2 -Property SamAccountName

Другой способ добиться того же эффекта - использовать -ExpandProperty в ваших Select-Objects:

$domain1 = Import-CSV C:\Scripts\Temp\domain1.xxx.org.csv | Select-Object -ExpandProperty SAMAccountName
$domain2 = Import-CSV C:\Scripts\Temp\domain2.xxx.org.csv | Select-Object -ExpandProperty SAMAccountName

Практически во всех случаях, когда я просто выбираю одно свойство с помощью Select-Object, -ExpandProperty дает мне то, что я действительно хочу - в данном случае необработанную строку.