У меня есть список пользователей из двух разных доменов. Эти списки находятся в формате 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 дает мне то, что я действительно хочу - в данном случае необработанную строку.