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

Difference between use ''#text'' and InnerText XML (Powershell)

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

 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

它工作正常。我不明白我需要将转换为字符串显式转换的区别或发生了什么。

谁能解释一下这种情况下的区别?

似乎与 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

或将上述任何 cast-like 操作应用于 $newCommand 赋值,例如如下:

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