gpt4 book ai didi

xml - 使用PowerShell从XML更新字符串

转载 作者:行者123 更新时间:2023-12-03 00:44:29 28 4
gpt4 key购买 nike

我正在从一些XML数据中检索文本字符串,然后尝试将其替换为其他字符串。我使用的代码是:

$newstring = "mystring"
$bar = Get-Gpo -Name "My GPO"
$gpoid = $bar.Id.ToString()
$drivesxml = New-Object XML
$drivesxml.Load("\\mydomain.co.uk\sysvol\mydomain.co.uk\Policies\{gpoid}\User\Preferences\Drives\drives.xml")
$oldpath = $drivesxml.Drives.Drive.Properties.Path[0]
$oldlabel = $drivesxml.Drives.Drive.Properties.Label[0]
#1
[string]$newtemppath = $oldpath -replace "Oldstring$", "$newstring"
[string]$newtemplabel = $oldlabel -replace "^Oldstring", "$newstring"
#2
$drivesxml.Drives.Drive.Properties.Path[0] = $newtemppath
$drivesxml.Drives.Drive.Properties.Label[0] = $newtemplabel
#3
$drivesxml.Save("\\mydomain.co.uk\sysvol\mydomain.co.uk\Policies\{gpoid}\User\Preferences\Drives\drives.xml")

它从sysvol fine检索XML,如果我查询 $oldpath$oldlabel,它们在第1点处包含XML中的预期文本。

在#2处,如果我查询 $newtemppath$newtemplabel,则按预期返回字符串,并修改了文本,因此“Oldstring”的实例已由“mystring”替换。

在#3处,如果我查询 $drivesxml.Drives.Drive.Properties.Path[0]$drivesxml.Drives.Drive.Properties.Label[0],我希望它们返回的内容与 $newtemppath$newtemplabel变量相同,但是它们继续返回其原始值。

保存XML之后,如果再次查询它,内容没有更改。

谁能看到我在#2和#3之间的分配可能做错了什么?

最佳答案

Powershell支持用于导航XML文件的“点路径”语法,这对于从XML文件读取数据非常方便-大概是为了方便使用XML输入或使用XML配置文件。

该语法的缺点是tries to return strings and arrays whenever it can。在您的情况下,$drivesxml.Drives.Drive.Properties.Path[0]是一个字符串,不再是XML节点,因此分配给该值的任何内容都会丢失。

诀窍是保留XML节点。实现此目的的最简单方法是use XPath for navigation(无论如何,它比点路径语法更强大):

$path = $drivesxml.SelectSingleNode('/Drives/Drive/Properties/Path')
$path.InnerText = $path.InnerText -replace "Oldstring$",$newstring

# ...

$drivesxml.Save($xmlPath)

您还可以使用 .SelectNodesforeach循环进行多次更改。

无关紧要的是,Powershell将在双引号字符串中进行变量插值。这可能与正则表达式冲突,其中 $具有其自身的含义。在上述情况下,没有任何歧义,但是最好养成对正则表达式使用单引号字符串的习惯:
$path.InnerText = $path.InnerText -replace 'Oldstring$',$newstring

关于XML namespace 的注释:如果XML文件使用 namespace (在元素上由 xmlns声明),则需要在使用XPath之前使这些名​​称空间已知: Using PowerShell, how do I add multiple namespaces (one of which is the default namespace)?

关于xml - 使用PowerShell从XML更新字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51385338/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com