Як отримати значення властивості об’єкта за назвою властивості?


132

Як у 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"

Чи є щось подібне до "Get-PropertyByName" в PowerShell?

Відповіді:


198

Звичайно

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

Або з цього приводу:

$obj."SomeProp"

12
пам'ятайте розширити: select -expand "SomeProp"якщо ви хочете значення. select "SomeProp"повертає об'єкт зберігання з властивістю "SomeProp", а потім він майже повернувся на етап 1.
Frode F.

2
Чи є спосіб використання $obj."SomeProp"в write-host?
Чоловік-булочка

@TheMuffinMan, так, це загальноприйнята функція, наприклад, запис хоста $ obj. "$ Somepropertyname"
Елрой Флін

4
Коли ваша рядок знаходиться в змінній, $obj.($propName)також працює. (Дужки не потрібно, але це виглядає дуже дивно для мене без них.)
jpmc26

3
Якщо у вас є, наприклад, $propNameзбережений в об'єкті, $Headers.PropertyNameтоді потрібні дужки $obj.($Headers.PropertyName).
Йонас Ломхольт

41

Розширення на @aquinas:

Get-something | select -ExpandProperty PropertyName

або

Get-something | select -expand PropertyName

або

Get-something | select -exp PropertyName

Я зробив ці пропозиції для тих, хто може просто шукати однорядкову команду для отримання якоїсь інформації та хотів включити приклад із реального світу.

Керуючи Office 365 через PowerShell, ось приклад, який я використовував для отримання всіх користувачів / груп, які були додані до списку "BookInPolicy":

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

Просто використання "Select BookInPolicy" скорочувало декількох членів, тому дякую за цю інформацію!


27

Ви можете отримати властивість за іменем за допомогою Select-Objectкомандлету та вказавши імена властивостей, які вас цікавлять. Зауважте, що це не просто повертає вихідне значення для цього ресурсу; натомість ви отримуєте щось, що все ще поводиться як об’єкт.

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

[PS]> $property

Name
----
armsvc

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

Для того, щоб використовувати значення для цієї властивості, вам все одно потрібно буде визначити, яку саме власність ви шукаєте, навіть якщо є лише одна властивість:

[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


8

Спробуйте це :

$obj = @{
    SomeProp = "Hello"
}

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

Ласкаво просимо до StackOverflow, будь ласка, відредагуйте своє запитання та поясніть, чому він повинен спробувати це та чому це покращує вже існуючі відповіді.
Т3 Н40

Я конфліктую між upvote та downvote, оскільки ця відповідь є IMO - найпростіший спосіб безпечно отримати властивість, заснований на тому, що назви рядка властивості від об’єкта, але також не дає жодних пояснень.
Троя Палачіно

`` `$ obj = @ {Prop =" Значення "; }; $ propName = "Підтримка" '; Write-Host "Значення $ propName становить $ ($ obj." $ PropName ")" $ propName = "НеіснуючийProp" '; Хост запису "Значення $ propName становить $ ($ obj." $ PropName ")" `` `надрукує, The value of Prop is Value а потімThe value of NonexistentProp is
Трой Палачіно

ОЦЕ ТАК! документація щодо розмітки пов'язана у довідці щодо коментарів, але не стосується їх. дійсно приємно SO devs
Troy Palacino

3

Ось альтернативний спосіб отримати значення властивості об’єкта:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.