我正在努力更新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)
如果我为这两个中的任何一个更改第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
它工作正常。我不明白我需要将演员表变成字符串的差异或发生了什么。
有人可以解释一下这种情况的区别吗?
答案 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