gpt4 book ai didi

xml - Powershell 4 XML 节点访问符号谜题

转载 作者:数据小太阳 更新时间:2023-10-29 03:00:39 26 4
gpt4 key购买 nike

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 魔法的乐趣 :-)

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

此类型在其他方法中包括属性 Item,就像在 C# 中一样,它用于处理带括号的访问器语法,因此编写

$config['a']

解析为函数调用

$config.Item('a')

它返回一个值 - 与给定名称匹配的第一个子节点。

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

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

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

$x = [xml]"<a> <b Id='1'/> <b Id='2'/> </a>"

然后 $x | Get-Member 显示常用的 XmlDocument 属性,包括 Item,以及返回单个 XmlElement 的属性 a。所以此时

$x['a']
$x.Item('a')
$x.a

所有返回相同。现在执行 $x.a |获取成员。您会看到 Item 仍然返回单个 XmlElement,但由于 b 在 XML 中出现不止一次,PowerShell 让 b 属性返回一个通用对象数组(恰好再次成为 XmlElement 类型)。

因此

$x.a.b

给你两个 Id 值,而

 $x.a['b']

只返回第一个。

关于xml - Powershell 4 XML 节点访问符号谜题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42417923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com