Для каждой вещи в одном CSV проверьте наличие нескольких типов совпадений в другом CSV - PullRequest
0 голосов
/ 04 февраля 2019

Извините, если описание неясно, но я не мог придумать, как еще его произнести.

У меня есть два CSV-файла:

LocalAdmins.csv - ColumnA = Имя ПК;ColumnB = имя пользователя в локальной группе администраторов

PC names and local admin usernames for each PC

Exempt.csv - ColumnA = имя ПК;ColumnB = имя пользователя, которому разрешено быть локальным администратором

PC names and allowed local admin usernames for each PC

То, что я пытаюсь сделать, это перебрать LocalAdmins.csv, и для каждой проверкипосмотрите, отображается ли имя ПК в файле Exempt.csv (или соответствует ли оно каким-либо определенным шаблонам именования в этом файле), и, если совпадение найдено, проверьте, отображается ли имя пользователя локального администратора для этого ПК в LocalAdmins.csv в спискеAllowedUsers для этого ПК в файле Exempt.csv.

Если имя пользователя НЕ в списке AllowedUsers или имя компьютера отсутствует в файле Exempt.csv, выведите запись из LocalAdmins.csv.Вот что у меня есть:

$admins = Import-Csv .\LocalAdmins.csv
$exempt = Import-Csv .\Exempt.csv
$violations = ".\Violations.csv"

foreach ($admin in $admins) {
    foreach ($item in $exempt) {
        if ($admin.PC -like $item.PC) {
            if ($admin.Name -notin ($item.AllowedUsers -split ",")) {
                $admin | Export-Csv $violations -Append -NoTypeInformation
            }
        }
        else {
            $admin | Export-Csv $violations -Append -NoTypeInformation
        }
    }
}

Проблема в том, что вложенный цикл foreach генерирует дубликаты, то есть если в Exempt.csv есть 3 строки, то одна запись в LocalAdmins.csv будет иметь 3 дублированных выхода.(по одному на каждую строку в Exempt.csv).Таким образом, результат выглядит следующим образом:

Current output

Когда он должен выглядеть следующим образом:

Desired output

Полагаю, проблема в структуре циклов, но мне просто нужна помощь, чтобы выяснить, что нужно настроить.Любой вклад приветствуется!

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

С лучшими ограничениями forEach, не должно быть дубликатов
и нет необходимости сортировать -unique.

Получение входных данных здесь-строк

## Q:\Test\2019\02\05\SO_54523868.ps1
$admins = @'
PC,NAME
XYZlaptop,user6
workstationXYZ,user7
computerABC,user8
ABClaptop,user1
'@ | ConvertFrom-Csv # .\LocalAdmins.csv

$exempt = @'
PC,AllowedUsers
*laptop,"user1,user2"
computerXYZ,"user3,user4"
workstation*,"user5"
'@ | ConvertFrom-Csv # .\Exempt.csv

$violationsFile = ".\Violations.csv"

$violations = foreach ($admin in $admins) {
    $violation = $True
    foreach ($item in ($exempt|Where-Object {$admin.PC -like $_.PC})){
        if ($admin.NAME -in ($item.AllowedUsers -split ',')){
            $violation = $False
        }
    }
    if ($violation){$admin}    
}
$violations
$violations | Export-Csv $violationsFile -NotypeInformation
## with Doug Finke's ImportExcel module  installed, you can directly get the excel file:
#$violations | Export-Excel .\Violatons.xlsx -AutoSize -Show
0 голосов
/ 05 февраля 2019

Не оптимизировано (должна работать уникальная сортировка по любому свойству):

$admins = Import-Csv .\LocalAdmins.csv
$exempt = Import-Csv .\Exempt.csv
$violations = ".\Violations.csv"

$(
    foreach ($admin in $admins) {
        foreach ($item in $exempt) {
            if ($admin.PC -like $item.PC) {
                if ($admin.Name -notin ($item.AllowedUsers -split ",")) {
                    $admin
                }
            }
            else {
                $admin
            }
        }
    }
) | Sort-Object -Property PC, Name -Unique  | 
            Export-Csv $violations -Append -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...