Powershell 4 XML节点访问表示法难题

Powershell 4 XML节点访问表示法难题,xml,powershell,Xml,Powershell,Powershell 4 windows Server 2008 R2 因此,最近我编写了一个Powershell脚本,用于拨入我的IIS机器web配置文件的应用程序池。我真的不知道这种访问XML节点的方式的名称,但第一次是这样做的: $appPoolNode = ($config['configuration']['system.applicationHost']['applicationPools']['add'] | where {$_.name -eq $AppPoolName}) 遗

Powershell 4 windows Server 2008 R2

因此,最近我编写了一个Powershell脚本,用于拨入我的IIS机器web配置文件的应用程序池。我真的不知道这种访问XML节点的方式的名称,但第一次是这样做的:

$appPoolNode = ($config['configuration']['system.applicationHost']['applicationPools']['add'] | where {$_.name -eq $AppPoolName})
遗憾的是,除了默认的应用程序池之外,这一切都不起作用。
因此,如果我想为另一个已创建的应用程序池更改某些内容,我无法从上面的代码行返回任何内容。我请来了一位同事,他向我展示了访问XML节点的点表示法:

$appPoolNode = ($config.configuration.'system.applicationHost'.applicationPools.add | where {$_.name -eq $AppPoolName})
不知怎的,这段代码起作用了

我的问题是:

第一个代码示例调用的是什么样的XML访问,为什么点表示法适用于其他应用程序池,而不是像第一个代码示例那样仅适用于defaultappPool?

PowerShell magic的乐趣:-)

您的
$config
变量属于从
System.Xml.XmlNode
派生的某种类型。当您将一些字符串强制转换为
[xml]
时,PowerShell会执行此操作

此类型包括一个属性
,与C#中一样,用于处理带括号的访问器语法,因此

$config['a']
解析为函数调用

$config.Item('a')
它返回一个值-与给定名称匹配的第一个子节点

现在,如果对此使用
表示法,则只需调用另一个属性,但在本例中,PowerShell在解析XML文件时动态添加了一个属性

它为每个子节点名称和在当前节点上找到的每个属性添加属性。如果有多个具有给定名称的子节点,则会使属性返回这些节点的数组,这与只返回第一个值的Item方法不同

要通过一个简单的示例了解这一点,请考虑

$x = [xml]"<a> <b Id='1'/> <b Id='2'/> </a>"
所有的返回都是一样的。现在做
$x.a |获得会员
。您可以看到,
Item
仍然返回单个XmlElement,但是由于b在XML中出现多次,PowerShell允许
b
属性返回一个泛型对象数组(碰巧又是XmlElement类型)

因此

$x.a.b
为您提供两个
Id
值,而

 $x.a['b']

只返回第一个。

很好的解释,@TToni:)
 $x.a['b']