Удалить дубликаты XML групп узлов в Powershell - PullRequest
1 голос
/ 26 марта 2020

У меня есть XML файл, который из-за повторного запуска скриптов и структуры папок может содержать дубликаты элементов пакета (см. Последние два пакета в примере XML).
Теперь мне нужна функция Powershell, которая удаляет все дубликаты пакетов , Дубликат в этом случае определяется точной комбинацией производителя, имени, версии, имени файла и исключения. Например, не следует удалять одинаковые пакеты программного обеспечения с разными версиями.

Пример XML:

<?xml version="1.0" encoding="iso-8859-1"?>
<softwaremetering xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="softwaremetering.xsd">
  <package>
    <manufacturer>BAFU</manufacturer>
    <name>EconoMe-Offline</name>
    <version>3.0</version>
    <filename>
    </filename>
    <exeversion>
    </exeversion>
  </package>
  <package>
    <manufacturer>BAFU</manufacturer>
    <name>EconoMe-Offline</name>
    <version>4.0.20</version>
    <filename>EconoMe-4_WinStart.exe</filename>
    <exeversion>*</exeversion>
  </package>
  <package>
    <manufacturer>BAFU</manufacturer>
    <name>Hakesch</name>
    <version>1.0.3b</version>
    <filename>
    </filename>
    <exeversion>
    </exeversion>
  </package>
  <package>
    <manufacturer>BAFU</manufacturer>
    <name>Hakesch</name>
    <version>1.04</version>
    <filename>hakesch.exe</filename>
    <exeversion>*</exeversion>
  </package>
  <package>
    <manufacturer>Balesio</manufacturer>
    <name>ALLCaptureEnterprise</name>
    <version>3.0</version>
    <filename>
    </filename>
    <exeversion>
    </exeversion>
  </package>
  <package>
    <manufacturer>Banana</manufacturer>
    <name>Buchhaltung</name>
    <version>7.0</version>
    <filename>
    </filename>
    <exeversion>
    </exeversion>
  </package>
  <package>
    <manufacturer>Banana</manufacturer>
    <name>Buchhaltung</name>
    <version>9.0</version>
    <filename>banana90.exe</filename>
    <exeversion>*</exeversion>
  </package>
  <package>
    <manufacturer>Banana</manufacturer>
    <name>Buchhaltung</name>
    <version>9.0.4</version>
    <filename>Banana90.exe</filename>
    <exeversion>*</exeversion>
  </package>
  <package>
    <manufacturer>Barco</manufacturer>
    <name>ClickShare-Extension-Pack</name>
    <version>1.0.2.3</version>
    <filename>clicksharelauncher.exe</filename>
    <exeversion>*</exeversion>
  </package>
  <package>
    <manufacturer>Barco</manufacturer>
    <name>ClickShare-Extension-Pack</name>
    <version>1.0.4.3</version>
    <filename>clicksharelauncher.exe</filename>
    <exeversion>*</exeversion>
  </package>
  <package>
    <manufacturer>Bernina</manufacturer>
    <name>Sticksoftware</name>
    <version>5.0</version>
    <filename>
    </filename>
    <exeversion>
    </exeversion>
  </package>
  <package>
    <manufacturer>Bernina</manufacturer>
    <name>Sticksoftware</name>
    <version>5.0</version>
    <filename>
    </filename>
    <exeversion>
    </exeversion>
  </package>
</softwaremetering>

1 Ответ

0 голосов
/ 26 марта 2020

Как уже прокомментировал Васиф Хасан , вы можете использовать Group-Object для этого.

[xml]$xml = Get-Content -Path 'X:\TheXmlFile.xml' -Raw

# find duplicate package nodes regarding all the properties that can make them a duplicate
$xml.softwaremetering.package | 
    Group-Object manufacturer,name,version,filename,exeversion | 
    Where-Object { $_.Count -gt 1 } | 
    ForEach-Object {
        $nodesToRemove = $_.Group | Select-Object -Skip 1
        foreach ($node in $nodesToRemove) {
            [void]$node.ParentNode.RemoveChild($node)
        }
}

# save to new file
$xml.Save("X:\TheUniqifiedXml.xml")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...