ここでは、StackOverflowでXML要素の属性値を変更する方法についてのみを探しています。
しかし、PowerShellを使用して要素自体の値をどのように変更しますか?
私は現在持っています:
[〜#〜] xml [〜#〜]
<Task>
<Settings>
...
</Settings>
<Actions Context="Author">
<Exec>
<Command>blablabla</Command>
<Arguments>CHANGETHISVALUE</Arguments>
</Exec>
</Actions>
</Task>
[〜#〜] script [〜#〜]
$filePathToTask = C:\Task.xml
$xml = New-Object XML
$xml.Load($filePathToTask)
$element = $xml.SelectSingleNode("//Arguments")
$element.InnerText("newtext")
$xml.Save($filePathToTask)
ただし、最後の変数でメソッドを使用することはできません。私は何を間違えていますか?
編集
取得しているエラーはです。null値の式でメソッドを呼び出すことはできません
私の問題は以下にあると思います:
$ElementToChange = $xml.SelectSingleNode("//Arguments")
Nullのままですが、.SelectNodes
などのメソッドを試し、//Arguments
タグで遊んでみましたが、まだ成功していません
InnerText
はプロパティであり、メソッドではありません。次のように使用されます。
_$element.InnerText = "newtext"
_
また、投稿したXMLサンプルとは異なり、元のデータは名前空間を使用していると思われます。 $xml.SelectSingleNode('//Arguments')
が空の結果を返す唯一の理由であるAFAICS。 WindowsタスクスケジューラからエクスポートされたXMLファイルは、確実に名前空間が付けられます。
_<Task version="1.2" xmlns="http://schemas.Microsoft.com/windows/2004/02/mit/task">
<!-- ... -->
</Task>
_
名前空間は他のノード属性とは異なり、ノード自体だけでなく、その子ノードにも影響します。名前空間を持つXMLからノードを選択するには、 namespace manager が必要です。
_$nsm = New-Object Xml.XmlNamespaceManager($xml.NameTable)
$nsm.AddNamespace('ns', $xml.DocumentElement.NamespaceURI)
$element = $xml.SelectSingleNode('//ns:Arguments', $nsm)
_
実行すると:
$filePathToTask = "C:\temp\Task.xml"
$xml = New-Object XML
$xml.Load($filePathToTask)
$element = $xml.SelectSingleNode("//Arguments")
$element.InnerText = "New Text"
$xml.Save($filePathToTask)
出力を再確認すると、更新された値が表示されます。
<Task>
<Settings>
</Settings>
<Actions Context="Author">
<Exec>
<Command>blablabla</Command>
<Arguments>New Text</Arguments>
</Exec>
</Actions>
</Task>
パスを引用符で囲むと、ロードラインでエラーが発生しました。いずれにしても、Loadメソッドのパラメーターはstring filepathを入力として受け取るため、これは良い習慣です。次に、Ansgarが言及しているように、代入演算子( "=")を使用してメモリに新しい値を設定し、ファイルにダンプします。