2013-07-29 13 views
11

Sto attraversando una serie di oggetti e posso visualizzare gli oggetti bene.Accesso ai valori delle proprietà dell'oggetto in PowerShell

$obj 

visualizza ogni oggetto nel mio ciclo foreach fine. Sto provando ad accedere ai campi dell'oggetto e ai loro valori. Questo codice funziona anche bene:

$obj.psobject.properties 

Per vedere solo i nomi dei campi di ciascun oggetto, faccio questo:

$obj.psobject.properties | % {$_.name} 

che funziona anche bene.

Quando provo ad accedere ai valori di coloro campo in questo modo:

$obj.psobject.properties | % {$obj.$_.name} 

nulla viene restituito o visualizzate.

Questo è fatto a scopo diagnostico per vedere se posso accedere ai valori dei campi. Il dilemma principale è che non posso accedere al valore di un campo specifico. Cioè

$obj."some field" 

non restituisce un valore anche se ho confermato che "un campo" ha un valore.

Questo mi ha sconcertato. Qualcuno sa cosa sto sbagliando?

risposta

20

Una volta iterate sulle proprietà all'interno di foreach, diventano disponibili tramite $_ (simbolo oggetto corrente). Proprio come avete stampato i nomi delle proprietà con $_.Name, utilizzando $_.Value stamperà i loro valori:

$obj.psobject.properties | % {$_.Value} 
+1

+1. Sospettavo qualcosa di ovvio come questo, quindi sono andato avanti per controllare, ma hai postato la tua risposta quando sono tornato. Come nota a margine di OP - potresti aver scoperto la proprietà 'Value' in questo modo:' $ obj.psobject.properties | gm'. – Neolisk

+0

L'ho fatto a scopo diagnostico per vedere se potevo accedere ai valori dei campi. Tuttavia quando provo ad accedere al valore di un certo campo che conosco esiste, come $ obj. "Campo certo", non viene restituito nulla –

4

Precedenza degli operatori interpreta che nel seguente modo:

($obj.$_).Name 

che porta a nulla perché si vuole

$obj.($_.Name) 

che valuterà prima il nome di una proprietà e quindi accederà al numero $obj.

+0

Ho pensato a questo come di solito incorporo parentesi per questo motivo esatto. Ancora non cede ciò che voglio. –

+0

È strano. Un semplice test per me era '$ a = gci | selezionare -f 1; $ a.psobject.properties |% {$ _. Name + "' t't "+ $ a. ($ _. Name)}' che funziona bene. – Joey

+0

Un altro modo è con le virgolette: '$ obj." $ ($ _.nome) "' – x0n

0

Non c'è bisogno di iterare su tutte le proprietà se avete solo bisogno il valore di uno di loro:

$obj.psobject.properties["bla"].value 
Problemi correlati