Powershell 4 XML节点访问表示法难题
Powershell 4 windows Server 2008 R2 因此,最近我编写了一个Powershell脚本,用于拨入我的IIS机器web配置文件的应用程序池。我真的不知道这种访问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}) 遗
$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']