¿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?

Respuestas:


198

Por supuesto

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

O para el caso:

$obj."SomeProp"

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!


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


8

Prueba esto :

$obj = @{
    SomeProp = "Hello"
}

Write-Host "Property Value is $($obj."SomeProp")"

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

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

$ 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.