使用 Compare-Object 比较 CSV 的两个特定属性并未得到预期结果

使用 Compare-Object 比较 CSV 的两个特定属性并未得到预期结果

我有来自两个不同域的用户列表。这些列表采用 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 不会将对象评估为字符串。我该如何实现这一点?

答案1

给定示例 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

如果您想要比较两个 PSCustomObjects 之间的 NoteProperty,因为我们不只是评估字符串,所以您只需要告诉Compare-Object您想要比较哪个属性:

Compare-Object $domain1 $domain2 -Property SamAccountName

答案2

实现相同效果的另一种方法是在 Select-Objects 中使用 -ExpandProperty:

$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 都会提供我真正想要的内容 - 在本例中是原始字符串。

相关内容