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

Я использую Powershell для написания скрипта, который на основе входного файла разделяет каждый раздел и манипулирует основными данными. С практической точки зрения у меня есть TXT-файл, который отформатирован так:

-------Group_Name_1-------
member: Name:Host1 Handle:123
member: Name:Host2 Handle:213
member: Name:Host3 Handle:321

-------Group_Name_2-------
member: Name:Host10 Handle:1230
member: Name:Host20 Handle:2130

Group (member of): Firewall subnet
etc...

До сих пор я придумал следующий скрипт:

$filepath = 'C:\test.txt'
$getfile = Get-Content $filepath -Raw

$regex_group_name = '.*-------'

foreach($object in $splitfile){
$lines = $object.Split([Environment]::NewLine)

$data_group_name = @($lines) -match $regex_group_name
$data_group_value = $data_group_name -replace '-------' , ''

Write-Host $data_group_value
}

Я пытаюсь чтобы получить следующий вывод для каждой группы (например):

add group name Group_Name_1 members.1 "Host1" members.2 "Host2" members.3 "Host3" groups.1 "Firewall Subnet"

И я застрял в 2 частях:

1) Сценарий выше, очевидно, не будет работать, потому что функция «split» в основном удалит имя группы: как я могу подойти к этой проблеме, чтобы получить желаемый результат?

2) Я понятия не имею, как изменить вывод, чтобы отразить эффективное число участников (если членов 2, то будут выведены только члены.1 и участники.2; альтернативно члены.1, члены.2, члены.3 и т. д. c ...).

Спасибо заранее за вашу помощь.

1 Ответ

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

Я бы решил это за два шага.

  • Сначала проанализируйте файл в структуре данных (в данном случае массив PSCustomObjects)
  • Затем преобразуйте их в командные строки.

Предполагая, что это $fileContent

$fileContent = "-------Group_Name_1-------
member: Name:Host1 Handle:123
member: Name:Host2 Handle:213
member: Name:Host3 Handle:321

-------Group_Name_2-------
member: Name:Host10 Handle:1230
member: Name:Host20 Handle:2130

Group (member of): Firewall subnet
etc..."

Мы можем построить шаг 1 следующим образом:

$sections = $fileContent -split "(?m)^-------" 

$groups = foreach ($section in $sections) {
    $group = [pscustomobject]@{
        Name     = ([regex]"(.*)-------").Match($section).Groups[1].Value
        Members  = @(([regex]"member: Name:(\S+)").Matches($section) | ForEach-Object {
            $_.Groups[1].Value
        })
        MemberOf = @(([regex]"Group \(member of\): (.+)").Matches($section) | ForEach-Object {
            $_.Groups[1].Value
        })
    }
    if ($group.Name) {
        $group
    }
}

# intermediate results (parsed group structure)
$groups

Это печатает

Name         Members               MemberOf          
----         -------               --------          
Group_Name_1 {Host1, Host2, Host3} {}                
Group_Name_2 {Host10, Host20}      {Firewall subnet}

Теперь легко повернуть это в другой формат:

$commands = foreach ($group in $groups) {
    $str = "add group "
    $str += "name `"$( $group.Name )`" "
    $i = 1
    foreach ($member in $group.Members) {
        $str += "members.$i `"$member`" "
        $i++
    }
    $i = 1
    foreach ($memberOf in $group.MemberOf) {
        $str += "groups.$i `"$memberOf`" "
        $i++
    }
    $str.Trim()
}

# final results (command strings)
$commands

Какие отпечатки:

add group name "Group_Name_1" members.1 "Host1" members.2 "Host2" members.3 "Host3"
add group name "Group_Name_2" members.1 "Host10" members.2 "Host20" groups.1 "Firewall subnet"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...