在Power Shell脚本中将json作为参数传递

时间:2019-03-31 17:00:24

标签: powershell powershell-v2.0

我已经创建了一个用于创建新的xml节点的函数。我的函数中有两个参数,一个是现有的xml文件引用,第二个是元素值。在运行脚本时显示错误

enter image description here

代码

function createProviderNode($xmlData,$propertyValue){
Write-Host 'inside createProviderNode'
Write-Host ($propertyValue)
#[xml]$xmlData = get-content E:\powershell\data.xml
$newProviderNode = $xmlData.CreateNode("element","provider","")
$newProviderNode.SetAttribute("name",$propertyValue)
$xmlData.SelectSingleNode('providers').AppendChild($newProviderNode)
$xmlData.save("E:\powershell\data.xml")

}

我是否错过了这段代码?

2 个答案:

答案 0 :(得分:1)

好吧,您不显示原始XML格式。 您为什么注释掉该Get-Content?没有它就无法工作。

因此,如果我们采用以下示例,它将按预期工作。

# Simple XML version

$SimpleXml = $null

$SimpleXml = @"
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <name>Apple</name>
    <size>1234</size>
</configuration>
"@


# New node code
[xml]$XmlDoc = Get-Content -Path variable:\SimpleXml

$runtime = $XmlDoc.CreateNode("element","runtime","")

$generated = $XmlDoc.CreateNode("element","generatePublisherEvidence","")
$generated.SetAttribute("enabled","false")

$runtime.AppendChild($generated)

$XmlDoc.configuration.AppendChild($runtime)

$XmlDoc.save("$pwd\SimpleXml.xml")
Get-Content -Path "$pwd\SimpleXml.xml"


# Which creates this:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <name>Apple</name>
  <size>1234</size>
  <runtime>
    <generatePublisherEvidence enabled="false" />
  </runtime>
</configuration>

除非为屏幕输出着色,否则永远不需要Write-Host。 默认为Write-Output,无论是否指定Write-Output,它都会自动写入屏幕。

所以,所有这些都是同一件事-输出到屏幕上。

$SomeString = 'hello'
Write-Host $SomeString
Write-Output $SomeString

'hello'
"hello"
$SomeString
"$SomeString"
($SomeString)
("$SomeString")
$($SomeString)

# Results

hello
hello
hello
hello
hello
hello
hello

…但是,这是您的选择。

答案 1 :(得分:1)

该错误消息表示在您预期 $xmlData时包含类型为[xml]System.Xml.XmlDocument)的对象-即XML文档-实际上,它是 string [string]

换句话说:当您调用createProviderNode函数时,传递的第一个参数是 string ,而不是XML文档(类型为[xml])。 / p>

$xmlData参数变量键入为[xml]可解决此问题,因为这将隐式隐藏XML文档上的 string 参数。需求-如果可能的话。

一个简化示例,使用脚本块代替函数:

$xmlString = @'
<?xml version="1.0"?><catalog><book id="bk101"><title>De Profundis</title></book></catalog>
'@

# Note how $xmlData is [xml]-typed.
& { param([xml] $xmlData) $xmlData.catalog.book.title } $xmlString

上面的代码产生De Profundis,表明字符串参数已转换为[xml]实例(由于PowerShell的类型自适应魔术,该实例使元素名称可用作直接属性)。 然后可以安全地在.CreateNode()上调用$xmlData方法。