Pregunta

Me falta algo aquí:

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher  
$objSearcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry  
$objSearcher.Filter = ("(objectclass=computer)")  
$computers = $objSearcher.findall()  

Entonces la pregunta es ¿por qué difieren los dos resultados siguientes?

$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
¿Fue útil?

Solución

Cuando incluyó $_.properties.name en la cadena, devolvió el nombre del tipo de la propiedad.Cuando una variable se incluye en una cadena y se evalúa la cadena, llama al método ToString en ese objeto al que hace referencia la variable (sin incluir los miembros especificados después).

En este caso, el método ToString devuelve el escribe un nombre.Puede forzar la evaluación de la variable y los miembros de manera similar a lo que sugirió EBGreen, pero usando

"Server name in quotes $($_.properties.name)"  

En el otro escenario Potencia Shell está evaluando la variable y los miembros especificados primero y luego agregándolos a la cadena anterior.

Tienes razón en que estás recuperando una colección de propiedades.si tu tubería $computadora[0].properties Para obtener miembro, puede explorar el modelo de objetos directamente desde la línea de comando.

La parte importante está a continuación.

Escribe un nombre:System.DirectoryServices.ResultPropertyCollection

Nombre Tipo de miembro Definición


Valores Propiedad System.Collections.ICollection Valores {get;}

Otros consejos

Creo que tiene que ver con la forma en que PS interpola la información en el "".Prueba esto:

"Nombre del servidor entre comillas $($_.properties).name"

O incluso puede que necesites un conjunto más de $().No estoy en ningún lugar donde pueda probarlo en este momento.

Cerrar: lo siguiente funciona correctamente, pero me interesaría si alguien tuviera una explicación más profunda.

PS C:\> $computers[0] | %{ "$_.properties.name"; "$($_.properties.name)" }
System.DirectoryServices.SearchResult.properties.name
GORILLA

Entonces parece que $_.properties.name no tiene la deferencia que esperaba.Si estoy visualizando correctamente, el hecho de que la propiedad del nombre tenga varios valores hace que devuelva una matriz.Lo que (creo) explicaría por qué funciona lo siguiente:

$computers[0] | %{ $_.properties.name[0]}

Si "nombre" fuera una cadena, debería devolver el primer carácter, pero como es una matriz, devuelve la primera cadena.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top