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
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top