Powershell Сравнение значений для нескольких массивов - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь сравнить данные из нескольких источников, а затем дать мне отчет об ошибках. Из-за меняющейся природы исключений я хотел создать таблицу исключений в формате csv, которую я могу изменить на лету.

Я собираюсь предоставить данные как можно лучше, и покажу вам, чего я пытаюсь достичь, и покажу вам, где у меня возникают проблемы.

Список исключений содержит префикс для различных типов учетных записей:

Exceptions List
_______________
FQ
Q
HQ
E

Так что, если моя учетная запись была BND123, тогда у меня может быть учетная запись с именем FQBND123 или QBND123. Я хочу иметь возможность добавить в этот список, если одна из команд решит, что им необходимо создать учетную запись JQ или что-нибудь подобное в будущем.

Это пример Inventoryreport.csv Я хочу разобрать:

Safe        Target system user name
HUMAN_ABC       QABC
HUMAN_CDE       QCDE
HUMAN_FGHIJ     QFGHIJ
HUMAN_P123456   root
HUMAN_KLMNO     QKLMNO1
HUMAN_P789123   FQ789123

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

Так что в случае данных выше 2 строки приведут к ошибке ниже.

HUMAN_P123456   root
HUMAN_KLMNO     QKLMNO1

Root по понятной причине и учетная запись KLMNO из-за трейлинга 1.


Проблема, которую я получаю, состоит в том, что она говорит, что все является ошибкой. Если я введу это вручную в цикл, все будет хорошо.

У меня были исключения в цикле foreach тоже внутри цикла для инвентаря, но он продолжает повторять одни и те же результаты и все равно выплевывает все.

Надеюсь, это хорошее объяснение, я уверен, что делаю это сложнее, чем нужно.

$loc = $scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
$D = $loc + "\Exceptions\Exceptions.csv"
$E = $loc + "\Import\InventoryReport.csv"

$exceptions = Import-Csv -LiteralPath $D 
$inventory = Import-Csv -LiteralPath $E

$list2 = 'Inventory Report Exceptions'
$list3 = 'Target system user name'

$DO = $loc + "\Report\Inventory Report Errors" + "$((Get-Date).ToString('MM-dd-yyyy')).CSV"
$time = (Get-Date).ToString()

foreach ($item in $inventory) {
    $input1 = $item.Safe -replace "HUMAN_"
    $input4 = $item.Safe -replace "HUMAN_P"
    $input2 = $item.$list3
    $input3 = $item.Safe

    if ($input2 -eq ($exceptions.$list2 + $input1) -or $input2 -eq ($exceptions.$list2 + $input4)) {
        return
    }
    else {
        $newitem = New-Object -TypeName PSCustomObject -Property  @{
            Safe  = $input1
            Owner = $input2
        }| Export-CSV -LiteralPath $DO -NoTypeInformation -append
    }
}

1 Ответ

0 голосов
/ 02 ноября 2018

Ваш вопрос немного длинный и не очень понятный ...

Давайте посмотрим, правильно ли я понял:

  • Я сократил список исключений до регулярного выражения, привязанного в начале
  • смоделируйте inventory.csv со строкой здесь
  • добавить столбец Перейти к этому
  • повторяет записи, сравнивая разделенные значения на равенство и сохраняя в новом столбце.

## Q:\Test\2018\11\02\SO_53109141.ps1
$Inventory = @"
Safe,Target system user name
HUMAN_ABC,QABC
HUMAN_CDE,QCDE
HUMAN_FGHIJ,QFGHIJ
HUMAN_P123456,root
HUMAN_KLMNO,QKLMNO1
HUMAN_P789123,FQ789123
"@ | ConvertFrom-Csv

#$Exception = [regex]'^(FQ|Q|HQ|E)'
$Exception = [RegEx]("^("+((Import-Csv .\exceptions.csv).'Exceptions List' -join '|')+")")

$Fail = $Inventory | Select-Object *,Pass | ForEach-Object {
   if ( ($_.Safe -split '_P?')[1] -ne ($_.'Target system user name' -split $Exeption)[2]){
       [PSCustomObject]@{
          Safe = ($_.Safe -split '_')[1]
         Owner= $_.'Target system user name'
       }
    }
}
$Fail | Export-Csv '.\new.csv' -NoTypeInformation

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

Safe          Target system user name  Pass
----          -----------------------  ----
HUMAN_ABC     QABC                     True
HUMAN_CDE     QCDE                     True
HUMAN_FGHIJ   QFGHIJ                   True
HUMAN_P123456 root                    False
HUMAN_KLMNO   QKLMNO1                 False
HUMAN_P789123 FQ789123                 True

РЕДАКТИРОВАТЬ, вы можете прочитать в исключении из файла:

> import-csv .\exceptions.csv

Exceptions List
---------------
FQ
Q
HQ
E

И построить RegEx из содержания:

$Exception = [RegEx]("^("+((Import-Csv .\exceptions.csv).'Exceptions List' -join '|')+")")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...