Хэш-таблица PowerShell из нескольких столбцов Excel и дальнейшее использование - PullRequest
0 голосов
/ 04 сентября 2018

Я читаю несколько столбцов файла Excel и сохраняю значения в хэше. Моя цель - использовать этот хеш в дальнейшем как

Hostname: $computer['server']['hostname']         # Hostname: host1
IP: $computer['server']['ip']                     # IP: x.x.x.x
Environment: $computer['server']['Environment']   # Environment: production

Фрагмент кода:

$computers = @{}
$computers['Server'] = @{}
$computers['Server']['Hostname'] = @()
$computers['Server']['Environment'] = @()
$computers['Server']['ip'] = @()   

for ($startRow=2; $startRow -le $rowCount; $startRow++) {
    $hostname = $workSheet.Cells.Item($startRow,2).Value()
    $environment = $workSheet.Cells.Item($startRow,1).Value()
    $pip = $workSheet.Cells.Item($startRow,4).Value()
    $sip = $workSheet.Cells.Item($startRow,5).Value()

    $computers['Server']['Hostname'] += $hostname
    $computers['Server']['Environment'] += $environment
    $computers['Server']['ip'] += $ip
}

foreach ($computer in $computers) {
    foreach ($server in $computer['Server']) {
        $myhost = $computer['Server']['Hostname']
        $environ = $computers['Server']['Environment']

        Write-Host "$myhost : $environ `n"  
    }    
}

Фактический объем производства:

host1 host2 host3 host4 : prod dev prod stag

Ожидаемый результат:

host1: prod
host2: dev
host3: prod
host4: stag

ПРИМЕЧАНИЕ РЕДАКТИРОВАНИЯ : Я всегда могу вызывать и отображать переменные в самом начале цикла for для самого цикла при чтении файлов Excel, но я также хочу сохранить их в хэш-таблице для дальнейшего использования.

1 Ответ

0 голосов
/ 04 сентября 2018

Вы получаете этот результат, потому что созданная вами структура данных выглядит следующим образом (с использованием нотации JSON):

{
    "Server": {
        "Hostname": [ "host1", "host2", "host3", "host4" ],
        "Environment": [ "prod", "dev", "prod", "stag" ],
        "IP": [ ... ]
    }
}

когда вы действительно хотите что-то вроде этого:

{
    "Server": [
        {
            "Hostname": "host1",
            "Environment": "prod",
            "IP": ...
        },
        {
            "Hostname": "host2",
            "Environment": "dev",
            "IP": ...
        },
        {
            "Hostname": "host3",
            "Environment": "prod",
            "IP": ...
        },
        {
            "Hostname": "host4",
            "Environment": "stag",
            "IP": ...
        }
    ]
}

Чтобы получить желаемый результат, вам нужно создать массив хеш-таблиц и присвоить его ключу «Сервер», или просто сделать массив $computers, если «Сервер» в любом случае является вашим единственным ключом:

$computers = @(for ($startRow=2; $startRow -le $rowCount; $startRow++) {
    ...

    @{
        'Hostname'    = $hostname
        'Environment' = $environment
        'IP'          = $ip
    }
})

Затем вы можете перечислить компьютеры следующим образом:

foreach ($computer in $computers) {
    '{0}: {1}' -f $computer['Hostname', 'Environment']
}

В качестве альтернативы вы можете сделать $computers хеш хэшей

$computers = @{}
for ($startRow=2; $startRow -le $rowCount; $startRow++) {
    ...

    $computers[$hostname] = @{
        'Environment' = $environment
        'IP'          = $ip
    }
})

и перечислите хосты следующим образом:

foreach ($computer in $computers.GetEnumerator()) {
    '{0}: {1}' -f $computer.Key, $computer.Value['Environment']
}
...