使用PowerShell更新XML文件

And*_*rav 6 xml powershell

我正在使用PowerShell为多个服务器上的应用程序更新XML目录列表,但是在进行实际更新时遇到问题.使用以下XML作为示例,查看使用qualnas1更新文件路径以使用类似\ GlobalNAS ...等的内容并删除qualnas2条目.

<?xml version="1.0" encoding="UTF-8" ?>
<directory>
    <filepath>\\qualnas1\library\content</filepath>
    <filepath>\\qualnas2\library\content</filepath>
    <filepath type="sssb">\\qualnas1\SSSB\content</filepath>
</directory>
Run Code Online (Sandbox Code Playgroud)

当我使用$ _.InnerText时,type = sssb的文件路径节点有效,但无法找到更新或删除其他节点的方法.这是我的代码:

$DirectoryXMLPath = 'C:\Temp\directory.xml'
if (Test-Path $DirectoryXMLPath)
{
    $DirectoryXML = New-Object XML
    $DirectoryXML.Load($DirectoryXMLPath)
    $DirectoryXML.PreserveWhitespace = $true

    # Find qualnas1 path and replace with GlobalNAS
    $DirectoryXML.directory.filepath | Where-Object { $_ -eq '\\qualnas1\library\content' } | 
        ForEach-Object { $_.InnerText = '\\GlobalNAS\library\content' }

    # Find extraneous library paths and remove them
    $DirectoryXML.directory.filepath.Remove('\\qualnas2\library\content')
#   $DirectoryXML.directory.mountpoint | Where-Object { $_ -eq '\\qualnas2\library\content' } |
#       ForEach-Object { $DirectoryXML.RemoveChild($_) }

    # This line is good!  Need InnerText as attribute type exists
    $DirectoryXML.directory.filepath | Where-Object { $_.InnerText -eq '\\qualnas1\SSSB\content' } | 
        ForEach-Object { $_.InnerText = '\\GlobalNAS\SSSB\content' }
}
Run Code Online (Sandbox Code Playgroud)

如果我使用PowerGUI逐步执行代码,则会找到每个节点并按照我的预期尝试替换/删除,但要么得到错误(字符串到XmlElement转换),要么没有错误但没有更新,这取决于我如何分配.无论如何在SSSB示例中没有属性的情况下更改/删除特定节点?

And*_*ndi 5

我会使用一个小的Xpath来获取XML节点的句柄.对我来说,这比使用PowerShell为XML节点创建的属性更容易.

# Find qualnas1 path and replace with GlobalNAS
$DirectoryXML.SelectNodes('/directory/filepath') | ? {
        $_.InnerText -eq '\\qualnas1\library\content'
    } | % {
        $_.InnerText = '\\GlobalNAS\library\content'
    }

# Find extraneous library paths and remove them
$DirectoryXML.SelectNodes('/directory/filepath') | ? {
        $_.InnerText -eq '\\qualnas2\library\content'
    } | % {
        $_.ParentNode.RemoveChild($_)
    }
Run Code Online (Sandbox Code Playgroud)

  • 安迪 - 将其插入我的代码并且工作得很好.谢谢您的帮助! (2认同)