Сортировка результатов оператора If без использования объекта сравнения - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь создать функцию сортировки, чтобы отсортировать мои объекты в три разных списка.Каждый объект содержит имена серверов (среди прочего) в столбце «Имя».Я пытаюсь создать три списка.Один содержит имена серверов, которые появляются в обоих объектах, другой содержит имена серверов, которые отображаются только в объекте txtFile, а другой содержит имена серверов, которые отображаются только в объекте csvFile.Вот что у меня есть:

If ($txtFile.Name -contains $csvFile.Name) {
    $onBothLists += $csvFile.Name
}
ElseIf ($txtFile.Name -notcontains $csvFile.Name) {
   $onlyOnTxtFile += $txtFile.Name
}
ElseIf ($csvFile.Name -notcontains $txtFile.Name) {
   $onlyOnCsvFile += $csvFile.Name
}

Моя проблема в том, что когда я запускаю это, $onBothLists и $onlyOnTxtFile заполняются, а $onlyOnCsvFile - нет.Однако, когда я запускаю Compare-Object для них, он выводит три списка точно так, как я ожидаю.Моя логика здесь неверна?

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Для ответа на ваш предыдущий вопрос :

## Q:\Test\2018\12\21\SO_53886784.ps1

$csvFile = Import-Csv .\sample.csv
$txtFile = Import-csv .\sample.txt -Header Name

$newCsv = Compare-Object -Ref $csvFile -Dif $txtFile -Property Name -IncludeEqual

$onBothLists   = $newCsv | Where-Object SideIndicator -eq '==' | Select-Object -Expand Name
$onlyOnTxtFile = $newCsv | Where-Object SideIndicator -eq '=>' | Select-Object -Expand Name
$onlyOnCsvFile = $newCsv | Where-Object SideIndicator -eq '<=' | Select-Object -Expand Name

Пример вывода:

> $onBothLists
wddg9028
htew804

> $onlyOnTxtFile
test1234

> $onlyOnCsvFile
other321
0 голосов
/ 21 декабря 2018

Вы можете зацикливать списки самостоятельно, но Compare-Object уже выполняет все необходимые итерации и сравнения .Вам просто нужно отфильтровать результаты потом. Это легко сделать с помощью Group-Object.

Compare-Object возвращает список объектов, каждый из которых содержит 2 свойства: исходный объект (.InputObject) и указатель того, какой список результирующийобъект был найден в (.SideIndicator), который показывает == для объектов в обоих или ракеты для направления <= и =>.

Группируя по боковому индикатору и предоставляя групповые результаты в виде [hashtable], мы можем легко индексировать в эту таблицу рядом с индикатором, чтобы получить желаемые результаты:

$list1 = echo serverA serverB serverC serverD serverE
$list2 = echo serverD serverE serverF serverG serverH

$grouped = Compare-Object -ReferenceObject $list1 -DifferenceObject $list2 -IncludeEqual | 
    Group-Object -Property SideIndicator -AsHashTable -AsString


# both
$grouped['=='].InputObject

# in list1
$grouped['<='].InputObject

# in list2
$grouped['=>'].InputObject

Только дляте, которые одинаковы, вы можете сделать это:

Compare-Object -ReferenceObject $list1 -DifferenceObject $list2 -IncludeEqual -ExcludeDifferent
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...