我只在StackOverflow上找到有关如何更改XML元素属性值的内容。
但是我们如何使用PowerShell更改元素本身的值?
我目前有:
XML
$filePathToTask = C:\Task.xml
$xml = New-Object XML
$xml.Load($filePathToTask)
$element = $xml.SelectSingleNode("//Arguments")
$element.InnerText("newtext")
$xml.Save($filePathToTask)
SCRIPT
$ElementToChange = $xml.SelectSingleNode("//Arguments")
但是,我似乎无法在最后一个变量上使用方法。我做错了什么?
修改
我得到的错误是您无法在空值表达式上调用方法
我认为我的问题在于:
.SelectNodes
哪个保持为空,但我尝试了//Arguments
之类的方法并使用socketio-jwt
标记,但仍未成功
答案 0 :(得分:8)
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)
答案 1 :(得分:5)
当我跑步时:
$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所提到的,使用赋值运算符(&#34; =&#34;)在内存中设置新值,然后转储到文件。