Обновление XML-файлов с помощью PowerShell - PullRequest
6 голосов
/ 11 февраля 2012

Я использую 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>

Узел filepath с type = sssb работает, когда я использую $ _. InnerText, но не может найти способ обновить или удалить другие узлы. Вот мой код:

$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' }
}

Если я перебираю код с помощью PowerGUI, то каждый узел будет найден, и попытка замены / удаления будет произведена, как я ожидал, но либо получу ошибки (преобразование строки в XmlElement), либо никаких ошибок, но не будет обновлений в зависимости от того, как я это делаю назначение. В любом случае, чтобы изменить / удалить определенные узлы, если нет атрибутов, как в примере SSSB?

1 Ответ

5 голосов
/ 11 февраля 2012

Я бы использовал немного 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($_)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...