2013-07-29 91 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。“$($ _。名称)“'' – x0n

0

您不必如果你只需要其中的一个值遍历所有属性:

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