Как получить значение свойства объекта по имени свойства в PowerShell?
В 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?
5 ответов
Конечно
write-host ($obj | Select -ExpandProperty "SomeProp")
Или в этом отношении:
$obj."SomeProp"
Расширение на @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
Простое использование "Выбрать BookInPolicy" отключило несколько участников, так что спасибо за эту информацию!
Вы можете получить недвижимость по названию, используя 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>
Определяет свойство для выбора и указывает, что должна быть предпринята попытка расширить это свойство.
[PS]> (Get-Process)[0] | Select-Object -ExpandProperty Name
armsvc
Попробуй это:
$obj = @{
SomeProp = "Hello"
}
Write-Host "Property Value is $($obj."SomeProp")"
Вот альтернативный способ получить значение свойства объекта:
write-host $(get-something).SomeProp
$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