Powershell访问模块内部函数的变量

时间:2016-10-27 10:42:13

标签: powershell module

任何人都可以解释一下为什么我可以从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>

2 个答案:

答案 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