Frage Wie erhält man den Wert einer Objekteigenschaft in PowerShell über den Namen der Eigenschaft?


Wie erhalten Sie in PowerShell den Eigenschaftswert eines Objekts, indem Sie seinen Namen angeben (eine Zeichenfolge)? Ich möchte 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 in PowerShell etwas Ähnliches wie "Get-PropertyByName"?


76
2018-01-18 19:34


Ursprung


Antworten:


Sicher

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

Oder für die Sache:

$obj."SomeProp"

117
2018-01-18 19:39



Erweiterung auf @aquinas:

Get-something | select -ExpandProperty PropertyName

oder

Get-something | select -expand PropertyName

oder

Get-something | select -exp PropertyName

Ich machte diese Vorschläge für diejenigen, die vielleicht nur nach einem einzeiligen Befehl suchten, um eine Information zu erhalten, und ein Beispiel aus der realen Welt einbeziehen wollten.

Bei der Verwaltung von Office 365 über PowerShell wurde hier ein Beispiel verwendet, mit dem alle Benutzer / Gruppen abgerufen wurden, die zur Liste "BookInPolicy" hinzugefügt wurden:

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

Mit "Select BookInPolicy" wurden mehrere Mitglieder abgeschnitten, also danke für diese Information!


28
2018-03-17 22:02



Sie können ein Eigentum namentlich mit dem Select-Object Cmdlet und geben Sie die Eigenschaftennamen an, an denen Sie interessiert sind. Beachten Sie, dass dies nicht einfach den Rohwert für diese Eigenschaft zurückgibt. Stattdessen erhältst du 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 das zu nutzen Wert Für diese Eigenschaft müssen Sie immer noch angeben, welche Eigenschaft Sie suchen, selbst 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, wenn Sie eine einzelne Eigenschaft innerhalb einer Zeichenkette verwenden möchten, müssen Sie den Ausdruck auswerten (Klammern um ihn legen) und ein Dollarzeichen ($) als Präfix angeben, 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 haben andere diese Frage mit der Empfehlung der. Beantwortet -ExpandProperty Parameter für die Select-Object Cmdlet. Dies umgeht einige der Probleme, indem der Wert der angegebenen Eigenschaft zurückgegeben wird. Sie sollten jedoch verschiedene Ansätze in verschiedenen Szenarien verwenden.

-ExpandProperty <String>

Gibt eine Eigenschaft an, die ausgewählt werden soll, und gibt an, dass ein Versuch durchgeführt werden sollte   gemacht werden, um diese Eigenschaft zu erweitern

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

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

 


10
2018-01-15 16:00



Versuche dies :

$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