168

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"

PowerShell の「Get-PropertyByName」に似たものはありますか?

4

6 に答える 6

259

もちろん

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

またはそのことについて:

$obj."SomeProp"
于 2013-01-18T19:39:05.693 に答える
36

You can get a property by name by name using the Select-Objectcmdlet and specify the property name(s) that you're interested in. これは単にそのプロパティの生の値を返すわけではないことに注意してください。代わりに、オブジェクトのように動作するものを取得します。

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

[PS]> $property

Name
----
armsvc

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

そのプロパティの値を使用するには、プロパティが 1 つしかない場合でも、目的のプロパティを特定する必要があります。

[PS]> $property.Name
armsvc

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

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

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

ここでの他の回答によると、文字列内で単一のプロパティを使用する場合は、式を評価し (括弧で囲みます)、プレフィックスとしてドル記号 ($) を付けて、挿入する変数として式を動的に宣言する必要があります。文字列に:

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

コマンドレットの-ExpandPropertyパラメーターを推奨することで、他の人がこの質問に正しく答えています。Select-Objectこれにより、指定されたプロパティの値が返されるため、頭痛の種の一部が回避されますが、さまざまなシナリオでさまざまなアプローチを使用する必要があります。

-ExpandProperty <String>

選択するプロパティを指定し、そのプロパティの展開を試みる必要があることを示します

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

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

于 2016-01-15T16:00:09.080 に答える
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
于 2016-10-12T22:14:46.727 に答える