2013-07-29 4 views
11

Я просматриваю массив объектов, и я могу отображать объекты в порядке.Доступ к значениям свойств объекта в PowerShell

$obj 

отображает каждый объект в моей петле foreach отлично. Я пытаюсь получить доступ к полям объектов и их значениям. Этот код прекрасно работает:

$obj.psobject.properties 

Чтобы просто увидеть имена полей каждого объекта, я делаю это:

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

, который также работает отлично.

Когда я пытаюсь получить доступ к значениям этих мест, делая это:

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

ничего не возвращаются или отображается.

Это делается для диагностических целей, чтобы узнать, могу ли я получить доступ к значениям полей. Основная дилемма заключается в том, что я не могу получить доступ к значению определенного поля. То есть

$obj."some field" 

не возвращает значение, хотя я подтвердил, что значение «какое-то поле» имеет значение.

Это меня озадачило. Кто-нибудь знает, что я делаю неправильно?

ответ

20

Как только вы перебираете свойства внутри foreach, они становятся доступными через $_ (текущий символ объекта). Так же, как вы напечатали имена свойств с $_.Name, используя $_.Value напечатает их значения:

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

+1. Я подозревал что-то столь же очевидное, как и это, поэтому пошел проверять, но вы отправили свой ответ к моменту моего возвращения. В качестве примечания к OP - вы могли бы открыть свойство «Value», выполнив следующее: '$ obj.psobject.properties | gm'. – Neolisk

+0

Я сделал это для диагностических целей, чтобы узнать, могу ли я получить доступ к значениям полей. Однако, когда я пытаюсь получить доступ к значению определенного поля, которое, как я знаю, существует, например $ obj. «Определенное поле», ничего не возвращается –

4

Оператор старшинство интерпретирует, что следующим образом:

($obj.$_).Name 

что приводит ни к чему, потому что вы хотите

$obj.($_.Name) 

, который сначала оценит название объекта, а затем получит доступ к нему по адресу $obj.

+0

Я думал об этом, поскольку я обычно включаю круглые скобки по этой точной причине. Все еще не дает того, чего я хочу. –

+0

Это странно. Простым испытанием для меня было '$ a = gci | выберите -f 1; $ a.psobject.properties |% {$ _. Name + "' t't "+ $ a. ($ _. Name)}', который работает отлично. – Joey

+0

Другой способ - с кавычками: '$ obj." $ ($ _.name) "' – x0n

0

Вам не придется перебрать все свойства, если вам просто нужно значение одного из них:

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