Как получить значение свойства объекта по имени свойства?

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"возвращает customobject со свойством SomeProp, а затем возвращается к шагу 1.
Frode F.
2
Есть ли способ использовать $obj."SomeProp"в write-host?
The Muffin Man
@TheMuffinMan, да, это общеприменимая функция, такая как write-host $ obj. "$ Somepropertyname"
Элрой Флинн
4
Когда ваша строка находится в переменной, $obj.($propName)тоже работает. (Скобки не обязательны, но для меня это выглядит очень странно без них.)
jpmc26
3
Если у вас есть, например, $propNameхранящийся в объекте, $Headers.PropertyNameскобки обязательны $obj.($Headers.PropertyName).
Йонас Ломхольдт 09
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» привело к отключению нескольких участников, поэтому спасибо за эту информацию!

JustaDaKaje
источник
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")"
Rainman-63
источник
Добро пожаловать в StackOverflow, отредактируйте свой вопрос и объясните, почему он должен попробовать это и почему это улучшает уже существующие ответы.
T3 H40
Я нахожусь в противоречии между положительным и отрицательным голосами, потому что этот ответ - ИМО, самый простой способ безопасного получения свойства, основанный на наличии строкового имени свойства из объекта, но также не предлагает никаких объяснений.
Трой Паласино
`` `$ obj = @ {Prop =" Значение "; }; $ propName = "Prop" '; Write-Host "Значение $ propName равно $ ($ obj." $ PropName ")" $ propName = "NonexistentProp" '; Write-Host "Значение $ propName равно $ ($ obj." $ PropName ")" `` будет напечатано, The value of Prop is Value а затемThe value of NonexistentProp is
Трой Паласино
ВОТ ЭТО ДА! документация по уценке связана с комментариями в справке, но не относится к ним. действительно хорошие разработчики SO
Трой Паласино
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
dhanoa
источник
$ 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,