2014-11-28 6 views
6

Ho il seguente:dinamicamente ottenere la proprietà PSCustomObject e valori

$test = [pscustomobject]@{ 
    First="Donald"; 
    Middle="Fauntleroy"; 
    Last="Duck"; 
    Age=80 
} 
$test | Get-Member -MemberType NoteProperty | % {"$($_.Name)="} 

che stampa:

Age= 
First= 
Last= 
Middle= 

vorrei estrarre il valore di ogni proprietà e lo hanno incluso come il valore per il mio nome valore coppie in modo che assomigli:

Age=80 
First=Donald 
Last=Duck 
Middle=Fauntleroy 

Sto provando a creare una stringa e non conosco i nomi delle proprietà prima del tempo. Come faccio a tirare i valori per completare le mie coppie di valori nominali?

risposta

7

L'unico modo che ho trovato (finora) è quello di fare qualcosa di simile:

$test = [pscustomobject]@{ 
    First="Donald"; 
    Middle="Fauntleroy"; 
    Last="Duck"; 
    Age=80 
} 

$props=Get-Member -InputObject $test -MemberType NoteProperty 

foreach($prop in $props) { 
    $propValue=$test | Select-Object -ExpandProperty $prop.Name 
    $prop.Name + "=" + $propValue 
} 

La chiave sta usando -ExpandProperty

Se qualcuno ha un modo più succinto di fare questo si prega di inviare!

+2

lieve miglioramento a la ricerca del valore: '$ prop.Name +" = "+ $ test. ($ prop.Name)' – scobi

+0

@scobi Ironic che mi serviva questo thread di 2 anni t Lo stesso giorno hai postato questo! La tua strada è molto succinta e una buona risposta alla domanda. Lo sposterei in una risposta! –

+0

ok, certo, perché no :) – scobi

4

più breve, più opzione poshy:

$test | Get-Member -MemberType NoteProperty | % Name | %{ 
    $_ + '=' + $test.$_ 
} 
1

Non sono sicuro se è davvero meglio, ma ecco un altro variante:

$test.psobject.Members | ? {$_.Membertype -eq "noteproperty"} | 
    %{ $_.Name + '='+ $_.Value } 
+0

Questo preleva anche metodi 'Object' come' ToString() 'e' GetHashCode() ', che potrebbe non essere quello che vuoi. Ad esempio, se sto enumerando le proprietà di un oggetto creato con 'ConvertFrom-Json', I * do * desidera solo le noteproperties che ottengo da' Get-Member -Type NoteProperty' – Arnavion

0

La mia variante:

$memberNames=($test |Get-Member -Type NoteProperty).Name 
foreach ($mname in $memberNames) { 
    "{0}={1}" -f $mname,$Test."$mname" 
}