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


En PowerShell, ¿cómo se 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?


76
2018-01-18 19:34


origen


Respuestas:


Por supuesto

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

O para el caso:

$obj."SomeProp"

117
2018-01-18 19:39



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 simplemente estar buscando un comando de una sola línea para obtener algún tipo de información y deseaban incluir un ejemplo del mundo real.

En la administración de 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 solo hecho de usar "Select BookInPolicy" estaba cortando varios miembros, ¡así que gracias por esta información!


28
2018-03-17 22:02



Puedes obtener un propiedad por nombre usando el Select-Object cmdlet y especificando el (los) nombre (s) de propiedad que le interesan. Tenga en cuenta que esto no devuelve simplemente el valor bruto para 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 usar el valor para esa propiedad, aún necesitará identificar qué propiedad está buscando, 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 quiere usar una sola propiedad dentro de una cadena, necesita evaluar la expresión (poner corchetes alrededor de ella) y prefijar con un signo de dólar ($) para declarar la expresión dinámicamente como una variable para insertar en la cadena:

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

Muy correctamente, otros han respondido a esta pregunta recomendando el -ExpandProperty parámetro para el Select-Object cmdlet. Esto pasa por alto algunos de los dolores de cabeza devolviendo el valor de la propiedad especificada, pero querrá usar diferentes enfoques en diferentes escenarios.

-ExpandProperty <String>

Especifica una propiedad para seleccionar, e indica que un intento debería   estar hecho para expandir esa propiedad

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

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

 


10
2018-01-15 16:00



Prueba esto :

$obj = @{
    SomeProp = "Hello"
}

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

2
2018-01-15 14:35



$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

0
2017-10-12 22:14