Powershell - разбирать дубликаты в списке - PullRequest
0 голосов
/ 08 января 2020

Я работаю над проблемой с поставленными SCCM группами соединений App-V. Иногда он доставляет клиенту несколько (дублирующих) групп соединений, и приложения работают неправильно.

Я запускаю get-appvclientconnectiongroups в контексте пользователя и там, где существуют дубликаты, экспортируя имя, идентификатор группы и версии в CSV.

Затем я импортирую это с использованием сеанса Powershell с повышенными правами (как Мне нужны права администратора для удаления групп соединений).

Поэтому заголовки CSV:

Имя, GroupID, VersionID

Дублирование находится в заголовке имени. только

Например,

Имя, идентификатор группы, идентификатор версии

Adobe_Reader, 123, 456

Adobe_Reader, 456, 789

Adobe_Reader, 111, 555

Блокнот, 333 222

Блокнот, 111 444

Приемник, 444 777

Приемник, 123 999

Что я хотел бы сделать, так это для каждого повторяющегося захвата имени идентификатор группы и идентификатор версии для использования в remove-appvclientconnectiongroup. ОДНАКО - я не могу sh делать это для каждой записи - я хочу остановиться, когда от каждого имени остается один (т. Е. Когда имя становится уникальным в списке).

Так что в конец списка будет:

Adobe_Reader, 111, 555

Блокнот, 111 444

Приемник, 123 999

И это те, которые мы не хотим запускать через командлет

Есть идеи? Извинения, если это не имеет смысла! Я играл с массивами, но быстро никуда не попал.

Ответы [ 3 ]

1 голос
/ 08 января 2020

Если у вас уже есть файл CSV, вы можете сделать следующее, чтобы вернуть последний элемент в группу идентичных имен:

Import-Csv file.csv | Group-Object Name |
    Foreach-Object { $_.Group[-1] }

Объяснение:

Используя Group-Object , вы можете группировать объекты на основе значения свойства. Здесь при группировании по свойству Name создается коллекция элементов со свойствами Count, Name, Group. Name содержит значения свойства, по которому вы группируете. Count содержит количество совпадающих значений этого сгруппированного свойства. Group содержит объекты с соответствующими значениями свойств.

Поскольку свойство Group содержит ваши объекты, вы можете получить доступ к объектам с помощью оператора доступа к элементу .. При передаче по каналу Foreach-Object , $_.Group возвратит группировку объектов. Тогда вам просто нужно взять последний элемент [-1] коллекции.

0 голосов
/ 09 января 2020

Спасибо! Мне удалось заставить его работать с кодом ниже после долгих раздумий. Поскольку может быть несколько экземпляров дубликатов, я поместил все в редактируемый массив, из которого удаляется строка при удалении групп. Затем он проверяет, сколько дубликатов осталось для любого данного пакета, и останавливается, когда остается один из каждого оставшегося

$data = import-csv $env:ALLUSERSPROFILE\AppvDuplciateGroups.csv

#Push the data into an ArrayList so it can be edited on the fly

$dataarray = [System.Collections.ArrayList]($data)

#Get the array size, number of duplicates and target array size

$arraysize = $dataarray.Count

$dupescount = $dataarray| group name

$arraytargetsize = $dupescount.count


$i = $arraysize -1


Function RemoveDuplicates(){

#select the relevant duplicate from the array based in index number (running bottom to top)

$lineX = $dataarray | select -Index $i

 #remove the duplicate

Remove-AppvClientConnectionGroup -GroupId $lineX.groupid -VersionId $lineX.VersionId

 #remove enrty from the array

$dataarray.RemoveAt($i)

 #check to see if that was the last entry for that particular connection group

$getcount = $dataarray | group-object name| Select-Object name, count | where name -eq $lineX.name

 #if there's still more that one entry for that package, run the function again on the next line up

If ($getcount.count -gt 1){

$i = $i -1

RemoveDuplicates}

 #if the array size is still larger than the calculated target array size, move up 2 lines in the array and run the function again

Else{

    If ($dataarray.count -gt $arraytargetsize){

        $i = $i -2

        RemoveDuplicates}

 #once the array meets the calculated target size, repair all connection groups and remove .csv file          

          
          Else{

                Repair-AppvClientConnectionGroup *

                Remove-Item -Path $env:ALLUSERSPROFILE\AppvDuplicateGroups.csv}

}

}

RemoveDuplicates ```


0 голосов
/ 08 января 2020

Если эта информация хранится в CSV-файле, вы можете сделать это, чтобы удалить все, кроме последней группы соединений:

Import-Csv -Path 'TheGroups.csv'  | Group-Object Name | Where-Object { $_.Count -gt 1 } | Foreach-Object { 
    $last = $_.Count - 2
    # remove all but the last connection group
    $_.Group[0..$last] | Remove-AppvClientConnectionGroup
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...