2017-04-05 27 views
2

このコード:更新アレイ素子

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

$xml = [xml]$test 
$xml.Test.Child[1] 

収率:

World 

次に、このコード:

$xml.Test.Child[1] = "StackOVerflow" 
$xml.InnerXml 

収率:

<Test><Child>Hello</Child><Child>World</Child></Test> 

2番目のChildノードがWorldからStackOverflowに更新されないのはなぜですか?

さて、何か別のことを試してみましょう:

$ipaddress=([System.Net.DNS]::GetHostAddresses($hostname)|Where-Object {$_.AddressFamily -eq "InterNetwork"} | select-object IPAddressToString)[0].IPAddressToString 

は、今私は $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 

答えて

1

PowerShell 6で修正された可能性のあるバグに関連しているようです。Linuxマシンを手元に置いて確認する必要はありません。

バグhereの説明があります。あなたはそれを発見したよう

一方、回避策は、あります:

$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 
+0

同じ動作PowerShellの6.0.0-alpha.13に –

+0

はこのいただきありがとうございますが、あなたは気づいているかもしれないとして、私はしました元の質問そのものに同じ仕事を掲載しました。 –