使用''#text''和InnerText XML(Powershell)之间的区别

时间:2017-11-09 16:39:29

标签: xml powershell scheduled-tasks innertext

我正在努力更新XML文件中的一些值,而我正在使用PowerShell执行此操作。 XML文件是导出的计划任务定义,我正在尝试更新Command节点的值,我想更改要执行的程序的路径的某些部分,我正在使用此代码:

 1-|[xml]$taskXmlDefinition = Get-Content -Path $pathXmlTaskDefinition
 2-|$oldCommand = $taskXmlDefinition.Task.Actions.Exec.Command
 3-|$programName = Split-Path -Leaf -Path $oldCommand
 4-|$newCommand =  Join-Path $newPath $programName
 5-|$taskXmlDefinition.GetElementsByTagName("Command")[0].'#text' = $newCommand
 6-|$newTaskXmlFilepath = (Join-Path $newPath $name)
 7-|$taskXmlDefinition.Save($newTaskXmlFilepath)

使用该代码,我收到此错误: enter image description here

如果我为这两个中的任何一个更改第5行,错误就会修复:

 5-|$taskXmlDefinition.GetElementsByTagName("Command")[0].'#text' = $newCommand.ToString()

 5-|[string]($taskXmlDefinition.GetElementsByTagName("Command")[0].'#text') = $newCommand

但是,我知道如果我问($newCommand).GetType()结果将是System.String,则不需要添加.ToString()

我更改了此代码的第(5)行:

5-|$taskXmlDefinition.GetElementsByTagName("Command")[0].InnerText = $newCommand

它工作正常。我不明白我需要将演员表变成字符串的差异或发生了什么。

有人可以解释一下这种情况的区别吗?

1 个答案:

答案 0 :(得分:1)

似乎与PowerShell中的这个错误有关:XML nodes are too picky about setting values

解决方法(不完整,选择任何):

$taskXmlDefinition.GetElementsByTagName("Command")[0].'#text' = "$newCommand"
$taskXmlDefinition.GetElementsByTagName("Command")[0].'#text' = $newCommand.ToString()
$taskXmlDefinition.GetElementsByTagName("Command")[0].'#text' = [string]$newCommand
$taskXmlDefinition.GetElementsByTagName("Command")[0].'#text' = $newCommand.PSObject.BaseObject

或将以上任何强制转换操作应用于$newCommand分配,例如如下:

$newCommand =  (Join-Path $newPath $programName).ToString()
$taskXmlDefinition.GetElementsByTagName("Command")[0].'#text' = $newCommand