web-dev-qa-db-ja.com

PowerShellを使用してXML要素の値を変更する

ここでは、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タグで遊んでみましたが、まだ成功していません

7
Kahn Kah

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)
_
12
Ansgar Wiechers

実行すると:

$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が言及しているように、代入演算子( "=")を使用してメモリに新しい値を設定し、ファイルにダンプします。

5
Dave_J