Powershell 更新xml文档中的数组元素

Powershell 更新xml文档中的数组元素,powershell,powershell-5.0,Powershell,Powershell 5.0,此代码: $test = @" <Test> <Child>Hello</Child> <Child>World</Child> </Test> "@ $xml = [xml]$test $xml.Test.Child[1] 然后这个代码: $xml.Test.Child[1] = "StackOVerflow" $xml.InnerXml 收益率: World <Test><Child&g

此代码:

$test = @"
<Test>
  <Child>Hello</Child>
  <Child>World</Child>
</Test>
"@

$xml = [xml]$test
$xml.Test.Child[1]
然后这个代码:

$xml.Test.Child[1] = "StackOVerflow"
$xml.InnerXml
收益率:

World
<Test><Child>Hello</Child><Child>World</Child></Test>
现在我想知道
$ipaddress
的类型是什么:

$ipaddress.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object
很明显,是绳子

$xml.Test.ChildNodes[1].'#text' = $ipaddress
Cannot set "#text" because only strings can be used as values to set XmlNode properties.
At line:1 char:1
+ $xml.Test.ChildNodes[1].'#text' = $ipaddress
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], SetValueException
    + FullyQualifiedErrorId : XmlNodeSetShouldBeAString
但是
$ipaddress
是字符串

这最终会起作用:

$xml.Test.ChildNodes[1].'#text' = [string]$ipaddress

发生了什么?

似乎与PowerShell 6中可能已修复的错误有关。我手头没有Linux机器可以检查

您将找到该错误的描述

同时,正如您所发现的,还有一个变通方法:

$test = @"
<Test>
  <Child>Hello</Child>
  <Child>World</Child>
</Test>
"@

$xml = [xml]$test
$xml.Test
$xml.Test.GetType()                 # = XmlElement

$xml.Test.Child[1]                      # = World
$xml.Test.Child[1].GetType()            # = String

$xml.Test.Child[1] = "Tralala"
$xml.Test.Child[1]                      # = World


$xml.Test.ChildNodes.Item(1).GetType()  # = XmlElement
$xml.Test.ChildNodes.Item(1)."#text" = "StackOverflow"
$xml.Test.Child[1]                      # = StackOverflow
$test=@”
你好
世界
"@
$xml=[xml]$test
$xml.Test
$xml.Test.GetType()#=XmlElement
$xml.Test.Child[1]#=世界
$xml.Test.Child[1].GetType()#=String
$xml.Test.Child[1]=“Tralala”
$xml.Test.Child[1]#=世界
$xml.Test.ChildNodes.Item(1.GetType()#=XmlElement
$xml.Test.ChildNodes.Item(1)。“#text”=“StackOverflow”
$xml.Test.Child[1]#=堆栈溢出

PowerShell 6.0.0-alpha.13上的相同行为谢谢您,但您可能已经注意到,我在原始问题中发布了相同的解决方法。
$test = @"
<Test>
  <Child>Hello</Child>
  <Child>World</Child>
</Test>
"@

$xml = [xml]$test
$xml.Test
$xml.Test.GetType()                 # = XmlElement

$xml.Test.Child[1]                      # = World
$xml.Test.Child[1].GetType()            # = String

$xml.Test.Child[1] = "Tralala"
$xml.Test.Child[1]                      # = World


$xml.Test.ChildNodes.Item(1).GetType()  # = XmlElement
$xml.Test.ChildNodes.Item(1)."#text" = "StackOverflow"
$xml.Test.Child[1]                      # = StackOverflow