Como obter o valor da propriedade de um objeto pelo nome da propriedade?


132

No PowerShell, como você obtém o valor da propriedade de um objeto especificando seu nome (uma string)? Eu quero algo como o seguinte:

$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"

Existe algo semelhante a "Get-PropertyByName" no PowerShell?

Respostas:


198

Certo

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

Ou, nesse caso:

$obj."SomeProp"

12
lembre-se de expandir: select -expand "SomeProp"se você deseja o valor. select "SomeProp"retorna um customobject com uma propriedade "SomeProp", e então ele é muito bonito de volta ao passo 1.
Frode F.

2
Existe uma maneira de usar $obj."SomeProp"em write-host?
The Muffin Man

@TheMuffinMan, sim, é um recurso geralmente aplicável, como o host de gravação $ obj. "$ Somepropertyname" #
Elroy Flynn

4
Quando sua string está em uma variável, $obj.($propName)também funciona. (Os parênteses não são necessários, mas parece realmente estranho para mim sem eles.)
jpmc26

3
Se você tiver $propNamearmazenado em um objeto, por exemplo $Headers.PropertyName, os parênteses serão necessários $obj.($Headers.PropertyName).
Jonas Lomholdt 9/08/19

41

Expandindo @aquinas:

Get-something | select -ExpandProperty PropertyName

ou

Get-something | select -expand PropertyName

ou

Get-something | select -exp PropertyName

Fiz essas sugestões para aqueles que podem estar apenas procurando um comando de linha única para obter algumas informações e desejam incluir um exemplo do mundo real.

No gerenciamento do Office 365 via PowerShell, aqui estava um exemplo que eu obtive para obter todos os usuários / grupos que foram adicionados à lista "BookInPolicy":

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

O simples uso de "Select BookInPolicy" estava cortando vários membros, então obrigado por esta informação!


27

Você pode obter uma propriedade pelo nome usando o Select-Objectcmdlet e especificando o (s) nome (s) da propriedade em que está interessado. Observe que isso simplesmente não retorna o valor bruto dessa propriedade; em vez disso, você obtém algo que ainda se comporta como um objeto.

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

[PS]> $property

Name
----
armsvc

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

Para utilizar o valor para essa propriedade, você ainda precisará identificar qual a propriedade que você está depois, mesmo se houver apenas uma propriedade:

[PS]> $property.Name
armsvc

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

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

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

Conforme outras respostas aqui, se você deseja usar uma única propriedade em uma sequência, é necessário avaliar a expressão (colocar colchetes em volta dela) e prefixar um cifrão ($) para declarar a expressão dinamicamente como uma variável a ser inserida na string:

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

Muito corretamente, outras pessoas responderam a essa pergunta recomendando o -ExpandPropertyparâmetro para o Select-Objectcmdlet. Isso evita parte da dor de cabeça retornando o valor da propriedade especificada, mas você deseja usar abordagens diferentes em diferentes cenários.

-ExpandProperty <String>

Especifica uma propriedade para selecionar e indica que deve ser feita uma tentativa de expandir essa propriedade

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

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


8

Tente o seguinte:

$obj = @{
    SomeProp = "Hello"
}

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

Bem-vindo ao StackOverflow, edite sua pergunta e explique por que ele deve tentar isso e por que melhora as respostas já existentes.
T3 H40

Estou em conflito entre voto positivo e voto negativo, porque esta resposta é a maneira mais simples de obter com segurança uma propriedade com base no fato de ter o nome da string da propriedade de um objeto, mas também não oferece nenhuma explicação.
Troy Palacino

`` `$ obj = @ {Prop =" Valor "; }; $ propName = "Prop" '; Host de gravação "O valor de $ propName é $ ($ obj." $ PropName ")" $ propName = "NoneexistentProp" '; Write-Host "O valor de $ propName é $ ($ obj." $ PropName ")" `` `será impresso The value of Prop is Value e depoisThe value of NonexistentProp is
Troy Palacino

UAU! a documentação da remarcação está vinculada na ajuda para comentários, mas não se aplica a eles. realmente bom SO devs
Troy Palacino

3

Aqui está uma maneira alternativa de obter o valor da propriedade de um objeto:

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") host de gravação $ arr [1] host de leitura $ arr + = "reza" host de gravação $ arr [3] host de gravação host de gravação $ arr [ $ arr.length-1] host de leitura $ arr = $ arr -ne $ arr [1] host de gravação $ arr host de leitura foreach ($ i em $ arr) {host de gravação $ i}
dhanoa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.