A comparação de duas propriedades específicas de um CSV usando o Compare-Object não está gerando os resultados esperados

2

Eu tenho uma lista de usuários de dois domínios separados. Essas listas estão no formato CSV e eu me importo apenas com o SAMAccountName, que é um campo nesses CSVs.

O código com o qual estou trabalhando atualmente é:

$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)

Isso está retornando apenas alguns resultados (que não são precisos) neste formato:

@{samaccountname=SomeUser}                                       =>

Obviamente, Compare-Object não está avaliando os objetos como strings. Como faço isso funcionar?

    
por MDMarra 09.11.2012 / 16:01

2 respostas

4

Dado o exemplo de arquivo CSV "domain1.xxx.org.csv", com o conteúdo como:

"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"

Podemos ver como Import-Csv converte o texto em um PSCustomObject usando os títulos:

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

Filtrar isso via Select-Object SAMAccountName resulta no seguinte:

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

Se você quiser comparar o NoteProperty em dois PSCustomObjects, porque não estamos apenas avaliando uma String, basta informar a Compare-Object com qual propriedade deseja comparar:

Compare-Object $domain1 $domain2 -Property SamAccountName
    
por 09.11.2012 / 16:07
2

Outra maneira de obter o mesmo efeito seria usar -ExpandProperty nos seus 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

Em praticamente todos os casos em que estou selecionando apenas uma propriedade com Select-Object, -ExpandProperty me obtém o que eu realmente quero - nesse caso, a string raw.

    
por 09.11.2012 / 23:59

Tags