2013-01-18 19 views
68

In PowerShell, come si ottiene il valore della proprietà di un oggetto specificandone il nome (una stringa)? Voglio qualcosa di simile al seguente:Come ottenere il valore della proprietà di un oggetto in base al nome della proprietà in PowerShell?

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

C'è qualcosa di simile a "Get-PropertyByName" in PowerShell?

risposta

110

Certo

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

O per quella materia:

$obj."SomeProp" 
+7

ricordare espandere: 'selezionare -expand" SomeProp "' se si desidera il valore. 'select" SomeProp "' restituisce un oggetto personalizzato con una proprietà "SomeProp", e quindi è praticamente tornato al punto 1. –

+2

C'è un modo per usare '$ obj." SomeProp "' in 'write-host'? –

+0

@TheMuffinMan, sì, è una caratteristica generalmente applicabile, come scrivere-host $ obj. "$ Somepropertyname" –

24

espansione su @aquinas:

Get-something | select -ExpandProperty PropertyName 

o

Get-something | select -expand PropertyName 

o

Get-something | select -exp PropertyName 

ho fatto questi suggerimenti per coloro che possono solo essere alla ricerca di un comando a linea singola per ottenere qualche pezzo di informazioni e volevano includere un esempio reale.

Nella gestione di Office 365 tramite PowerShell, qui era un esempio che ho usato per ottenere tutti gli utenti/gruppi che erano stati aggiunti alla lista "BookInPolicy":

Get-CalendarProcessing [email protected] | Select -expand BookInPolicy 

Basta con "Select BookInPolicy" è stato tagliando diversi membri, quindi grazie per questa informazione!

2

Prova questo:

$obj = @{ 
    SomeProp = "Hello" 
} 

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

Benvenuti in StackOverflow, si prega di modificare la domanda e spiegare * perché * dovrebbe provare questo e * perché * migliora il già risposte esistenti. –

8

è possibile ottenere una proprietà dal nome utilizzando la Select-Object cmdlet e specificando il nome della proprietà (s) che siete interessati a Si noti che questo non è così semplice ritorno. il valore grezzo 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 poter utilizzare il valoreper quella proprietà, sarà ancora bisogno di identificare quali proprietà che si sta dopo, anche se v'è 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 (mettere tra parentesi quadre) e prefisso con un segno 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 parametro -ExpandProperty per il cmdlet Select-Object. Ciò ignora parte del mal di testa restituendo il valore della proprietà specificata, ma si vorrà utilizzare approcci diversi in diversi scenari.

-ExpandProperty <String>

specifica una proprietà di selezionare, e indica che un tentativo dovrebbe essere fatto per espandere la struttura

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

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

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 
+0

$ arr = @ ("Jind", 12, "Singh") Write-Host $ arr [1] -host leggere $ arr + = "Reza" Write-Host $ arr [3] lettura-host write-host $ arr [$ arr.Length-1] -host leggere $ arr = $ arr -ne $ arr [1] write-host $ arr -host leggere foreach ($ i in $ arr) {scrivere-host $ i} – dhanoa

Problemi correlati