Come ottenere il valore della proprietà di un oggetto in base al nome della proprietà?


132

In PowerShell, come si ottiene il valore della proprietà di un oggetto specificando il suo nome (una stringa)? Voglio qualcosa di simile al seguente:

$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"

Esiste qualcosa di simile a "Get-PropertyByName" in PowerShell?

Risposte:


198

Sicuro

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

O del resto:

$obj."SomeProp"

12
ricorda di espandere: select -expand "SomeProp"se vuoi il valore. select "SomeProp"restituisce un oggetto personalizzato con una proprietà "SomeProp", quindi è praticamente tornato al passaggio 1.
Frode F.

2
C'è un modo per utilizzare $obj."SomeProp"in write-host?
The Muffin Man

@TheMuffinMan, sì, è una funzionalità generalmente applicabile, come write-host $ obj. "$ Somepropertyname"
Elroy Flynn,

4
Quando la stringa è in una variabile, $obj.($propName)funziona anche. (Le parentesi non sono necessarie, ma mi sembra davvero strano senza di loro.)
jpmc26

3
Se hai $propNamememorizzato un oggetto, ad esempio, $Headers.PropertyNamesono necessarie le parentesi $obj.($Headers.PropertyName).
Jonas Lomholdt,

41

Espandendo su @aquinas:

Get-something | select -ExpandProperty PropertyName

o

Get-something | select -expand PropertyName

o

Get-something | select -exp PropertyName

Ho dato questi suggerimenti per coloro che potrebbero semplicemente cercare un comando a riga singola per ottenere alcune informazioni e volevo includere un esempio del mondo reale.

Nella gestione di Office 365 tramite PowerShell, ecco un esempio che ho usato per ottenere tutti gli utenti / gruppi che erano stati aggiunti all'elenco "BookInPolicy":

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

Il solo uso di "Seleziona BookInPolicy" ha interrotto diversi membri, quindi grazie per queste informazioni!


27

È possibile ottenere una proprietà per nome utilizzando il Select-Objectcmdlet e specificando i nomi delle proprietà a cui si è interessati. Si noti che ciò non restituisce semplicemente il valore non elaborato per quella proprietà; invece ottieni qualcosa che si comporta ancora come un oggetto.

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

[PS]> $property

Name
----
armsvc

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

Per utilizzare il valore per quella proprietà, dovrai comunque identificare quale proprietà stai cercando, anche se esiste una sola proprietà:

[PS]> $property.Name
armsvc

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

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

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

Come per altre risposte qui, se si desidera utilizzare una singola proprietà all'interno di una stringa, è necessario valutare l'espressione (racchiuderla tra parentesi) e il prefisso con un simbolo di dollaro ($) per dichiarare l'espressione in modo dinamico come variabile da inserire nella stringa:

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

Abbastanza correttamente, altri hanno risposto a questa domanda raccomandando il -ExpandPropertyparametro per il Select-Objectcmdlet. Questo evita alcuni mal di testa restituendo il valore della proprietà specificata, ma ti consigliamo di utilizzare approcci diversi in diversi scenari.

-ExpandProperty <String>

Specifica una proprietà da selezionare e indica che è necessario tentare di espandere quella proprietà

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

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


8

Prova questo :

$obj = @{
    SomeProp = "Hello"
}

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

Benvenuto in StackOverflow, modifica la tua domanda e spiega perché dovrebbe provare questo e perché migliora le risposte già esistenti.
T3 H40,

Sono in conflitto tra upvote e downvote perché questa risposta è l'IMO il modo più semplice per ottenere in sicurezza una proprietà in base al fatto di avere il nome stringa della proprietà da un oggetto, ma non offre alcuna spiegazione.
Troy Palacino,

`` `$ obj = @ {Prop =" Value "; }; $ propName = "Prop" '; Write-Host "Il valore di $ propName è $ ($ obj." $ PropName ")" $ propName = "NonexistentProp" '; Write-Host "Il valore di $ propName è $ ($ obj." $ PropName ")" `` `stamperà The value of Prop is Value e poiThe value of NonexistentProp is
Troy Palacino

WOW! la documentazione di markdown è collegata nella guida per i commenti ma non si applica a loro. davvero simpatici sviluppatori SO
Troy Palacino

3

Ecco un modo alternativo per ottenere il valore della proprietà di un oggetto:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.