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

3

我正在使用PowerShell更新XML文件中的一些值。该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

现在它正常工作。我不理解需要将转换为字符串显式化的差异或发生了什么。

有人能解释一下这些情况的区别吗?


为什么你不像设置$oldCommand变量时那样直接访问命令字段呢? - Maximilian Burszley
我对代码的任何建议都持开放态度,但我的问题是原始代码有什么问题,为什么我第一次尝试的方式不起作用?我在问题末尾添加的三行代码使得代码能够正常工作,但我仍然会遇到同样的问题,即我不理解这些代码之间的区别是什么。 - Yanet Francisco
($taskXmlDefinition.GetElementsByTagName("Command")[0].'#text').GetType() 返回什么? - lit
($taskXmlDefinition.GetElementsByTagName("Command")[0].'#text').GetType() (IsPublic -> True | IsSerial ->True | Name-> String | BaseType-> System.Object) - Yanet Francisco
如果我执行 ($taskXmlDefinition.GetElementsByTagName("Command")[0].InnerText ).GetType() 我会得到相同的结果 (IsPublic -> True | IsSerial ->True | Name-> String | BaseType-> System.Object)。 - Yanet Francisco
除非你明确地将变量强制转换或声明为特定类型,否则它默认为System.Object。 - user8217724
1个回答

1

我看起来与PowerShell中的这个错误相关:XML节点对设置值过于挑剔

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

$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赋值应用上述任何类似于cast的操作,例如:

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

非常感谢,我以为它是PowerShell,但我不确定。有趣的情况,知道这一点非常有用。 - Yanet Francisco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接