嗨伙计们(也许是女士们),
在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>
我猜它是我忽略的小东西(对你们这么简单点:))。
答案 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