任何人都可以解释一下为什么我可以从xml文件中获取数据,如果我使用它:
[xml]$configXml = Get-Content -Path "c:\test.xml"
$configXml.Config.Client.Servers.Server.name
Output: srv1
但如果我在模块中使用它,我根本就没有数据:
[xml]$configXml = Get-Content -Path "c:\test.xml"
function global:XTR_GetXmlConfig{
Param(
[Parameter(Mandatory=$true)]
$Option
)
return $configXml.Config.$Option
}
XTR_GetXmlConfig -Option Client.Servers.Server.name
只有第一个节点使用模块检索数据:
XTR_GetXmlConfig -Option Client
我的xml非常基础:
?xml version="1.0" encoding="UTF-8"?>
<Config>
<Client>
<Domain>test.pt</Domain>
<Servers>
<Server>
<Name>srv1<Name>
<IP>192.168.0.1</IP>
</Server>
<Server>
<Name>srv2</Name>
<IP>192.168.0.2</IP>
</Server>
<Server>
<Name>srv3</Name>
<IP>192.168.0.3</IP>
</Server>
</Servers>
</Client>
</Config>
答案 0 :(得分:2)
这里的问题是它试图将整个$ option变量视为要访问的属性,而不是向下移动到树中(想想它试图像下面那样进行评估)
$configXml.Config.'Client.Servers.Server.name'
Theres probably a better way to deal with that but below is what I came up with, basically it builds the command to run from scratch and then invokes it, generated a plain list of server names on my machine. Hope this helps.
[xml]$configXml = Get-Content -Path "test.xml"
function XTR_GetXmlConfig{
Param(
[Parameter(Mandatory=$true)]
$Option
)
$options = $option.split('.')
[string]$command = 'return $configXml.Config'
foreach($o in $options){
$command += ".$($o)"
}
Invoke-Expression $command
}
XTR_GetXmlConfig -Option Client.Servers.Server.name
对于格式化,很抱歉,PowerShell永远不想正确粘贴。
答案 1 :(得分:2)
@Mike Garuccio的回答是对的。但是,我不确定是否需要在$ Option字符串上完成那么多工作。此外,我创建了参数的顶级部分以使其不在函数中。怎么样......?
[cmdletbinding()]
Param()
[xml]$configXml = Get-Content -Path ".\xmltest.xml"
function global:XTR_GetXmlConfig {
Param(
[Parameter(Mandatory=$true)]
$Option
)
Invoke-Expression "return `$configXml.$option"
}
XTR_GetXmlConfig -Option Config.Client.Servers.Server.name