文字列を使用してXML属性を設定していますが、PowerShellは「XmlNodeプロパティを設定するための値として使用できるのは文字列のみです」と言っています。これが簡単な例です。まず、これを実行します:
$xmlDoc = [xml]@"
<root>
<ComponentRef Id="a" />
</root>
"@
$newId = "b"
$length = $newId.Length
Write-Host ("`n`$newId is a string, see: `$newId.GetType().FullName = " + $newId.GetType().FullName + "`n")
Write-Host ("Running `"`$xmlDoc.root.ComponentRef.Id = `$newId`"...`n")
$xmlDoc.root.ComponentRef.Id = $newId
Write-Host ("ComponentRef.Id is now: " + $xmlDoc.root.ComponentRef.Id)
私の場合、出力は次のとおりです。
$newId is a string, see: $newId.GetType().FullName = System.String
Running "$xmlDoc.root.ComponentRef.Id = $newId"...
Cannot set "Id" because only strings can be used as values to set XmlNode properties.
At D:\Build\Tools\mass processing\Untitled4.ps1:14 char:27
+ $xmlDoc.root.ComponentRef. <<<< Id = $newId
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : PropertyAssignmentException
ComponentRef.Id is now: a
そのエラーメッセージは間違っている必要があります。上記の出力に示されているように、等号の右側の値は文字列です。ただし、エラーが発生したため、XML属性は引き続き「a」を読み取ります。今ではもっと奇妙になります。$ newId.lengthを呼び出す行をコメントアウトして、正しく機能することを確認しましょう。
そのようにコメントアウトする:#$length = $newId.Length
。出力は次のようになります。
$newId is a string, see: $newId.GetType().FullName = System.String
Running "$xmlDoc.root.ComponentRef.Id = $newId"...
ComponentRef.Id is now: b
最後の代入演算子の右側にある[string]にキャストすることでこの問題を回避する方法を知っているので、修正を求めていません。私が知りたいのは:
$ newId.Length(ゲッター!)を呼び出すと、PowerShellが$ newIdが文字列ではなくなったと見なす可能性がある理由を誰かが説明できますか?
ありがとう!