【问题标题】:Change XML Element value with PowerShell使用 PowerShell 更改 XML 元素值
【发布时间】:2017-07-30 16:55:40
【问题描述】:

我只是在 StackOverflow 上找到有关如何更改 XML 元素的属性值的资料。

但是我们如何使用 PowerShell 更改元素本身的值呢?

我目前有:

XML

<Task>
  <Settings>
  ...
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>blablabla</Command>
      <Arguments>CHANGETHISVALUE</Arguments>
    </Exec>
  </Actions>
</Task>

脚本

$filePathToTask = C:\Task.xml
$xml = New-Object XML
$xml.Load($filePathToTask)
$element =  $xml.SelectSingleNode("//Arguments")
$element.InnerText("newtext")
$xml.Save($filePathToTask)

但是,我似乎无法对最后一个变量使用方法。我做错了什么?

编辑

  • 添加代码

我得到的错误是 你不能在空值表达式上调用方法

我认为我的问题在于:

$ElementToChange =  $xml.SelectSingleNode("//Arguments")

它仍然为空,但我尝试了.SelectNodes 之类的方法并使用//Argumentstag 但仍然没有成功

【问题讨论】:

  • 如果您想让我们告诉您您做错了什么,您需要告诉我们您做了什么。以及产生了什么错误。
  • 对不起@AnsgarWiechers,我认为我的错误可能仅通过代码就很明显(就像我发布内容时一样),但你说得对,我现在就编辑它

标签: xml powershell scripting


【解决方案1】:

InnerText 是一个属性,而不是一个方法。它是这样使用的:

$element.InnerText = "newtext"

另外,我怀疑您的原始数据(与您发布的 XML 示例不同)使用名称空间。 AFAICS 这是$xml.SelectSingleNode('//Arguments') 返回空结果的唯一可能原因。 从 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)

【讨论】:

    【解决方案2】:

    当我跑步时:

    $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 提到的,使用赋值运算符(“=”)在内存中设置新值,然后转储到文件。

    【讨论】:

    • 谢谢,但是“转储到文件”是什么意思?你的意思是保存还是?
    • 是的,我的意思是“写入磁盘”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    相关资源
    最近更新 更多