Wie erhalte ich den Wert einer Objekteigenschaft anhand des Eigenschaftsnamens?

132

Wie erhalten Sie in PowerShell den Eigenschaftswert eines Objekts, indem Sie dessen Namen (eine Zeichenfolge) angeben? Ich möchte so etwas wie das Folgende:

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

Gibt es etwas Ähnliches wie "Get-PropertyByName" in PowerShell?

KFL
quelle

Antworten:

198

Sicher

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

Oder für diese Angelegenheit:

$obj."SomeProp"
Aquin
quelle
12
Denken select -expand "SomeProp"Sie daran, zu erweitern: wenn Sie den Wert wollen. select "SomeProp"gibt ein benutzerdefiniertes Objekt mit der Eigenschaft "SomeProp" zurück, und dann ist er so ziemlich zurück in Schritt 1.
Frode F.
2
Gibt es eine Möglichkeit zu verwenden , $obj."SomeProp"in write-host?
Der Muffin-Mann
@ TheMuffinMan, ja, es ist eine allgemein anwendbare Funktion, wie Write-Host $ obj. "$ Somepropertyname"
Elroy Flynn
4
Wenn sich Ihre Zeichenfolge in einer Variablen befindet, $obj.($propName)funktioniert dies ebenfalls. (Die Klammern sind nicht erforderlich, aber es sieht für mich ohne sie wirklich komisch aus.)
jpmc26
3
Wenn Sie das beispielsweise $propNamein einem Objekt gespeichert haben, $Headers.PropertyNamesind die Klammern erforderlich $obj.($Headers.PropertyName).
Jonas Lomholdt
41

@Aquinas erweitern:

Get-something | select -ExpandProperty PropertyName

oder

Get-something | select -expand PropertyName

oder

Get-something | select -exp PropertyName

Ich habe diese Vorschläge für diejenigen gemacht, die möglicherweise nur nach einem einzeiligen Befehl suchen, um Informationen zu erhalten, und wollte ein Beispiel aus der Praxis aufnehmen.

Bei der Verwaltung von Office 365 über PowerShell habe ich anhand eines Beispiels alle Benutzer / Gruppen abgerufen, die der Liste "BookInPolicy" hinzugefügt wurden:

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

Allein die Verwendung von "Select BookInPolicy" hat mehrere Mitglieder abgeschnitten. Vielen Dank für diese Informationen!

JustaDaKaje
quelle
27

Sie können eine Eigenschaft anhand des Namens mithilfe des Select-ObjectCmdlets abrufen und die Eigenschaftsnamen angeben, an denen Sie interessiert sind. Beachten Sie, dass dies nicht einfach den Rohwert für diese Eigenschaft zurückgibt. Stattdessen erhalten Sie etwas, das sich immer noch wie ein Objekt verhält.

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

[PS]> $property

Name
----
armsvc

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

Um den Wert für diese Eigenschaft verwenden zu können, müssen Sie weiterhin angeben, nach welcher Eigenschaft Sie suchen, auch wenn nur eine Eigenschaft vorhanden ist:

[PS]> $property.Name
armsvc

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

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

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

Wie bei anderen Antworten hier, müssen Sie, wenn Sie eine einzelne Eigenschaft innerhalb einer Zeichenfolge verwenden möchten, den Ausdruck auswerten (umklammern) und ein Dollarzeichen ($) voranstellen, um den Ausdruck dynamisch als einzufügende Variable zu deklarieren in die Zeichenfolge:

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

Ganz richtig, andere haben diese Frage beantwortet, indem sie den -ExpandPropertyParameter für das Select-ObjectCmdlet empfohlen haben. Dadurch wird ein Teil der Kopfschmerzen umgangen, indem der Wert der angegebenen Eigenschaft zurückgegeben wird. Sie sollten jedoch in verschiedenen Szenarien unterschiedliche Ansätze verwenden.

-ExpandProperty <String>

Gibt eine auszuwählende Eigenschaft an und gibt an, dass versucht werden soll, diese Eigenschaft zu erweitern

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

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

Charlie Joynt
quelle
7

Versuche dies :

$obj = @{
    SomeProp = "Hello"
}

Write-Host "Property Value is $($obj."SomeProp")"
Regenmann-63
quelle
Willkommen bei StackOverflow, bitte bearbeiten Sie Ihre Frage und erklären Sie, warum er dies versuchen sollte und warum es die bereits vorhandenen Antworten verbessert.
T3 H40
3

Hier ist eine alternative Möglichkeit, den Eigenschaftswert eines Objekts abzurufen:

write-host $(get-something).SomeProp
Duncan Clay
quelle
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
quelle
$ arr = @ ("jind", 12, "singh") Schreib-Host $ arr [1] Lese-Host $ arr + = "reza" Schreib-Host $ arr [3] Lese-Host Schreib-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