citando System.DirectoryServices.ResultPropertyCollection
-
08-06-2019 - |
Pergunta
Estou faltando alguma coisa aqui:
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry
$objSearcher.Filter = ("(objectclass=computer)")
$computers = $objSearcher.findall()
Portanto, a questão é por que as duas saídas a seguir são diferentes?
$computers | %{
"Server name in quotes $_.properties.name"
"Server name not in quotes " + $_.properties.name
}
PS> $computers[0] | %{"$_.properties.name"; $_.properties.name}
System.DirectoryServices.SearchResult.properties.name
GORILLA
Solução
Quando você incluiu $_.properties.name na string, ele estava retornando o nome do tipo da propriedade.Quando uma variável é incluída em uma string e a string é avaliada, ela chama o método ToString naquele objeto referenciado pela variável (sem incluir os membros especificados depois).
Neste caso, o método ToString está retornando o Digite o nome.Você pode forçar a avaliação da variável e dos membros de forma semelhante ao que EBGreen sugeriu, mas usando
"Server name in quotes $($_.properties.name)"
No outro cenário PowerShell está avaliando a variável e os membros especificados primeiro e depois adicionando-os à string anterior.
Você está certo ao dizer que está recebendo de volta uma coleção de propriedades.Se você canalizar $computador[0].properties para get-member, você pode explorar o modelo de objeto diretamente na linha de comando.
A parte importante está abaixo.
Digite o nome:System.DirectoryServices.ResultPropertyCollection
Nome MemberType Definição
Propriedade de valores System.Collections.ICollection Valores {get;}
Outras dicas
Acredito que tenha a ver com a forma como o PS interpola as informações no "".Experimente isto:
"Nome do servidor entre aspas $($_.properties).name"
Ou você pode até precisar de mais um conjunto de $().Não estou em um lugar onde possa testá-lo agora.
Fechar-- O texto abaixo funciona corretamente, mas estou interessado se alguém tiver uma explicação mais profunda.
PS C:\> $computers[0] | %{ "$_.properties.name"; "$($_.properties.name)" }
System.DirectoryServices.SearchResult.properties.name
GORILLA
Portanto, parece que $_.properties.name não faz a deferência como eu esperava.Se estou visualizando corretamente, o fato da propriedade name ter vários valores faz com que ela retorne um array.O que (eu acho) explicaria por que o seguinte funciona:
$computers[0] | %{ $_.properties.name[0]}
Se "nome" fosse uma string, deveria retornar o primeiro caractere, mas por ser um array, ele retornaria a primeira string.