尝试将XML变量传递给函数以更新XML文件

时间:2016-04-30 19:37:50

标签: powershell

嗨伙计们(也许是女士们),

在Powershell中,我尝试将变量传递给我的函数,我想用它来更新XML文件中的特定节点。我想将变量$ xml.config.server.username(我的XML文件中的节点)传递给我的函数并使用它来检查它是否已填充,如果它没有填充,请填写它$ Value也传递给函数。

到目前为止,我试过这个:

function XMLChecker
(
    [Parameter(Mandatory=$true)] $XMLFile,
    [Parameter(Mandatory=$true)] $Value,
    [Parameter(Mandatory=$true)] $LocationinXML
)

{
$XML = New-Object XML
$XML.load($XMLFile)

if ($LocationinXML -eq "") {
        Write-host "Value $Value is not found in XML file, adding it in the file." -fore Yellow
        $LocationinXML = [string]$Value
        $XML.save("$XMLFile")
        $XML.load("$XMLFile")
    }

为了调用这个函数,我尝试了这个:

XMLChecker -XMLFile C:\config.xml -Value "jabadabadoo" -LocationinXML "$xml.config.server.username" -ErrorAction Stop

以下是我的测试XML文件的一部分:

<config version="1.0">
  <server dnsname="localhost" ip="127.0.0.1" username="share" />
</config>

我猜它是我忽略的小东西(对你们这么简单点:))。

1 个答案:

答案 0 :(得分:1)

您可以使用scriptblock-parameter或Invoke-Expression + string-parameter来实现此目的。我会避免在参数值中要求$xml,因为用户不必知道函数是如何构建的。

调用-表达式:

function XMLChecker {
    param(
        [Parameter(Mandatory=$true)] $XMLFile,
        [Parameter(Mandatory=$true)] $Value,
        [Parameter(Mandatory=$true)] $LocationinXML
    )

    $XML = New-Object XML
    $XML.load($XMLFile)

    if ((Invoke-Expression "`$xml.$LocationinXML") -eq "") {
        Write-host "Value $Value is not found in XML file, adding it in the file." -fore Yellow
        Invoke-Expression "`$xml.$LocationinXML = '$Value'"
        $XML.save("$XMLFile")
    }

}

XMLChecker -XMLFile "C:\config.xml" -Value "jabadabadoo" -LocationinXML "config.server.usernames" -ErrorAction Stop

脚本块:

function XMLChecker {
    param(
        [Parameter(Mandatory=$true)] $XMLFile,
        [Parameter(Mandatory=$true)] $Value,
        [Parameter(Mandatory=$true)] [scriptblock]$LocationinXML
    )

    $XML = New-Object XML
    $XML.load($XMLFile)

    if (($LocationinXML.Invoke().Trim()) -eq "") {
        Write-host "Value $Value is not found in XML file, adding it in the file." -fore Yellow
        [scriptblock]::Create("$LocationinXML = '$Value'").Invoke()        
        $XML.save("$XMLFile")
    }

}

XMLChecker -XMLFile "C:\config.xml" -Value "jabadabadoo" -LocationinXML { $xml.config.server.username } -ErrorAction Stop