¿Cómo obtener el valor de la propiedad de un objeto por nombre de propiedad?

132

En PowerShell, ¿cómo obtiene el valor de propiedad de un objeto especificando su nombre (una cadena)? Quiero algo como lo siguiente:

$obj = get-something

# View the object's members:
$obj | gm

# I could retrieve a property by doing so:
write-host $obj.SomeProp

# But for many purposes, I would really want to:
write-host $obj | Get-PropertyByName "SomeProp"

¿Hay algo similar a "Get-PropertyByName" en PowerShell?

KFL
fuente

Respuestas:

198

Por supuesto

write-host ($obj | Select -ExpandProperty "SomeProp")

O para el caso:

$obj."SomeProp"
aquino
fuente
12
recuerda expandir: select -expand "SomeProp"si quieres el valor. select "SomeProp"devuelve un objeto personalizado con una propiedad "SomeProp", y luego regresa al paso 1.
Frode F.
2
¿Hay una manera de utilizar $obj."SomeProp"en write-host?
The Muffin Man
@TheMuffinMan, sí, es una característica generalmente aplicable, como write-host $ obj. "$ Somepropertyname"
Elroy Flynn
44
Cuando su cadena está en una variable, $obj.($propName)también funciona. (Los paréntesis no son obligatorios, pero me parece realmente extraño sin ellos.)
jpmc26
3
Si tiene el $propNamealmacenado en un objeto, por ejemplo $Headers.PropertyName, los paréntesis son obligatorios $obj.($Headers.PropertyName).
Jonas Lomholdt
41

Expandiendo sobre @aquinas:

Get-something | select -ExpandProperty PropertyName

o

Get-something | select -expand PropertyName

o

Get-something | select -exp PropertyName

Hice estas sugerencias para aquellos que podrían estar buscando un comando de una sola línea para obtener alguna información y quería incluir un ejemplo del mundo real.

Al administrar Office 365 a través de PowerShell, he aquí un ejemplo que utilicé para obtener todos los usuarios / grupos que se agregaron a la lista "BookInPolicy":

Get-CalendarProcessing conferenceroom@domain.com | Select -expand BookInPolicy

El simple uso de "Select BookInPolicy" estaba cortando a varios miembros, ¡así que gracias por esta información!

JustaDaKaje
fuente
27

Puede obtener una propiedad por nombre usando el Select-Objectcmdlet y especificando los nombres de propiedad que le interesan. Tenga en cuenta que esto no solo devuelve el valor bruto de esa propiedad; en cambio, obtienes algo que todavía se comporta como un objeto.

[PS]> $property = (Get-Process)[0] | Select-Object -Property Name

[PS]> $property

Name
----
armsvc

[PS]> $property.GetType().FullName
System.Management.Automation.PSCustomObject

Para utilizar el valor de esa propiedad, aún deberá identificar qué propiedad busca, incluso si solo hay una propiedad:

[PS]> $property.Name
armsvc

[PS]> $property -eq "armsvc"
False

[PS]> $property.Name -eq "armsvc"
True

[PS]> $property.Name.GetType().FullName
System.String

Según otras respuestas aquí, si desea usar una sola propiedad dentro de una cadena, debe evaluar la expresión (poner corchetes alrededor de ella) y el prefijo con un signo de dólar ($) para declarar la expresión dinámicamente como una variable para insertar en la cuerda:

[PS]> "The first process in the list is: $($property.Name)"
The first process in the list is: armsvc

Muy correctamente, otros han respondido esta pregunta recomendando el -ExpandPropertyparámetro para el Select-Objectcmdlet. Esto evita algunos de los dolores de cabeza al devolver el valor de la propiedad especificada, pero querrá usar diferentes enfoques en diferentes escenarios.

-ExpandProperty <String>

Especifica una propiedad para seleccionar e indica que se debe intentar expandir esa propiedad

https://technet.microsoft.com/en-us/library/hh849895.aspx

[PS]> (Get-Process)[0] | Select-Object -ExpandProperty Name
armsvc

Charlie Joynt
fuente
8

Prueba esto :

$obj = @{
    SomeProp = "Hello"
}

Write-Host "Property Value is $($obj."SomeProp")"
rainman-63
fuente
Bienvenido a StackOverflow, edite su pregunta y explique por qué debería intentar esto y por qué mejora las respuestas ya existentes.
T3 H40
Estoy en conflicto con el voto a favor frente al voto negativo porque esta respuesta es IMO, la forma más sencilla de obtener de forma segura una propiedad basada en tener el nombre de cadena de la propiedad de un objeto, pero tampoco ofrece ninguna explicación.
Troy Palacino
`` `$ obj = @ {Prop =" Value "; }; $ propName = "Prop" '; Write-Host "El valor de $ propName es $ ($ obj." $ PropName ")" $ propName = "NonexistentProp" '; Write-Host "El valor de $ propName es $ ($ obj." $ PropName ")" `` `se imprimirá The value of Prop is Value y luegoThe value of NonexistentProp is
Troy Palacino
¡GUAUU! la documentación de rebajas está vinculada en la ayuda para comentarios pero no se aplica a ellos. muy buenos desarrolladores SO
Troy Palacino
3

Aquí hay una forma alternativa de obtener el valor de propiedad de un objeto:

write-host $(get-something).SomeProp
Duncan Clay
fuente
0
$com1 = new-object PSobject                                                         #Task1
$com2 = new-object PSobject                                                         #Task1
$com3 = new-object PSobject                                                         #Task1



$com1 | add-member noteproperty -name user -value jindpal                           #Task2
$com1 | add-member noteproperty -name code -value IT01                              #Task2
$com1 | add-member scriptmethod ver {[system.Environment]::oSVersion.Version}       #Task3


$com2 | add-member noteproperty -name user -value singh                             #Task2
$com2 | add-member noteproperty -name code -value IT02                              #Task2
$com2 | add-member scriptmethod ver {[system.Environment]::oSVersion.Version}       #Task3


$com3 | add-member noteproperty -name user -value dhanoa                             #Task2
$com3 | add-member noteproperty -name code -value IT03                               #Task2
$com3 | add-member scriptmethod ver {[system.Environment]::oSVersion.Version}        #Task3


$arr += $com1, $com2, $com3                                                          #Task4


write-host "windows version of computer1 is: "$com1.ver()                            #Task3
write-host "user name of computer1 is: "$com1.user                                   #Task6
write-host "code of computer1 is: "$com1,code                                        #Task5
write-host "windows version of computer2 is: "$com2.ver()                            #Task3
write-host "user name of computer2 is: "$com2.user                                   #Task6
write-host "windows version of computer3 is: "$com3.ver()                            #Task3
write-host "user name of computer3 is: "$com1.user                                   #Task6
write-host "code of computer3 is: "$com3,code                                        #Task5

read-host
dhanoa
fuente
$ arr = @ ("jind", 12, "singh") write-host $ arr [1] read-host $ arr + = "reza" write-host $ arr [3] read-host write-host $ arr [ $ arr.length-1] read-host $ arr = $ arr -ne $ arr [1] write-host $ arr read-host foreach ($ i in $ arr) {write-host $ i}
dhanoa