我有来自两个不同域的用户列表。这些列表采用 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 都会提供我真正想要的内容 - 在本例中是原始字符串。