使用 ''#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
我正在更新 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