передать JSON в качестве параметра в сценарии Power Shell - PullRequest
1 голос
/ 31 марта 2019

Я создал функцию для создания нового узла 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 ]

1 голос
/ 01 апреля 2019

Сообщение об ошибке подразумевает, что в то время как вы ожидали $xmlData, чтобы содержать объект типа [xml] (System.Xml.XmlDocument) - то есть документ XML - на самом деле это был строка ([string]) .

Другими словами: когда вы вызывали свою функцию createProviderNode, первым передаваемым аргументом была строка , а не документ XML (типа [xml]).

Ввод переменной параметра $xmlData в качестве [xml] решает эту проблему , поскольку она неявно преобразует даже аргумент string в документ XML по запросу - если это возможно.

Упрощенный пример с использованием блока скрипта вместо функции:

$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.

1 голос
/ 01 апреля 2019

Ну, вы не показываете свой оригинальный формат 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

... но это ваш выбор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...