Попытка добавить столбец в вывод CSV

Мне нужно добавить имя хоста в каждую строку, как показано ниже.

во-первых, я добавил параметр Hostname внутри функции.

Param(
    [parameter(Mandatory=$True, ValueFromPipeline = $True, Position = 0)]
        [String[]]$ComputerName,
        [String[]]$Hostname,
        [switch]$Online
)

затем я добавил переменную Hostname внутри PSCustomObject.

$pingable.add([PSCustomObject]@{'Hostname' =$Hostname;'Computer' = $Status.Address; 'Online' = $reachable})

Затем,

Get-Pingables -ComputerName $servers.RecordData -Hostname $servers.Hostname

Но я получаю результат, как показано ниже.

 Hostname     Computer       Online
--------     --------       ------
{app1, app2} 10.xx.xx.xx  False
{app1, app2} 10.xx.xx.xx  False

Мой список.csv:

Hostname,RecordData
apps1,10.xx.xx.xx
apps2,10.xx.xx.xx

Мой желаемый результат:

Hostname Computer        Online
-------- --------        ------
apps1    10.xx.xx.xx    True
apps2    10.xx.xx.xx    True

Скрипт:

Function Get-Pingables {
    [cmdletbinding()]
    Param(
        [parameter(Mandatory=$True, ValueFromPipeline = $True, Position = 0)]
            [String[]]$ComputerName,
            [String[]]$Hostname,
            [switch]$Online
    )

    $pingable = [System.Collections.Generic.List[PSObject]]::new()
    $ComputerName | ForEach-Object {
        Set-Variable -Name "Status_$_" -Value (Test-Connection -ComputerName $_ -AsJob -Count 1)
    }

    Get-Variable "Status_*" -ValueOnly | ForEach-Object {
        $Status = Wait-Job $_ | Receive-Job 
        $reachable = $False
        $addr = ""
        
        if ($Status.ResponseTime -ne $null ) {
            $addr = $Status.Address
            $reachable = $True
            
        }

        $pingable.add([PSCustomObject]@{'Hostname' =$Hostname;'Computer' = $Status.Address; 'Online' = $reachable})
    }
    if ($Online) {
        Return $pingable | Where-Object { $_.Online } | Select-Object Computer
    } else {
        Return $pingable | Sort-Object -Descending -Property 'Online'
    }
}  

$servers = Import-Csv 'C:\temp\list.csv'

Get-Pingables $servers.RecordData | Export-Csv "c:\temp\output.csv" -NoTypeInformation

ОБНОВЛЕНИЕ1:

ВВОД CSV:

HostName,RecordData
srv01,10.xx.xx.xx
srv02,10.xx.xx.xx

ВЫХОД CSV:

"Hostname","Computer","Online"
"srv01",,"False"
"srv02",,"False"
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Возможно, вам будет лучше работать с Get-Pingables по одному элементу за раз и использовать Foreach для управления циклами.

Также рекомендуется, чтобы имена функций были в единственном числе, поэтому используйте Get-Pingable

Примеры:

$servers | ForEach-Object {
    Get-Pingable -ComputerName $_.RecordData -Hostname $_.Hostname
} | Export-Csv 'c:\temp\output.csv' -NoTypeInformation

или

$PingedCsv = foreach ($server in $servers) { 
    Get-Pingable -ComputerName $server.RecordData -Hostname $server.Hostname
} 
$PingedCsv | Export-Csv 'c:\temp\output.csv' -NoTypeInformation

или

$servers.foreach{
    Get-Pingable -ComputerName $_.RecordData -Hostname $_.Hostname
} | Export-Csv 'c:\temp\output.csv' -NoTypeInformation

Если вам НУЖНО Get-Pringable использовать массив, просто используйте параметр [Object[]]$Computer, а затем разберитесь со свойствами внутри функции.

«Имя хоста», «Компьютер», «В сети» «System.String[]», «10.xx.xx.xx», «False» «System.String[]», «10.xx.xx.xx.xx ","False" возвращает system.String в качестве имени хоста.

Arbelac 02.04.2024 15:28
Ответ принят как подходящий

Я считаю, что было бы лучше, если бы функция работала с объектами, созданными Import-Csv, чтобы сохранить данные вместе.

Теперь вы отправляете ему части RecordData и Hostname как отдельные массивы и внутри функции, хотя вы выполняете цикл по RecordData, вы не сохраняете соответствующее имя хоста для каждого объекта.

По сути, вы хотели бы, чтобы ваша функция не только проверяла соединение каждой конкретной машины, но и в конце вы хотели бы либо отсортировать результаты, либо вывести просто список объектов «Компьютер», в зависимости от переключателя Online.

Пытаться

Function Get-Pingables {
    [cmdletbinding()]
    Param(
        [parameter(Mandatory = $True, ValueFromPipeline = $True, Position = 0)]
        [object[]]$InputObject,
        [switch]$Online
    )
    process {
        $pingable = foreach ($machine in $InputObject) {
            Test-Connection -ComputerName $machine.RecordData -AsJob -Count 1 | 
            Get-Job | 
            Receive-Job -Wait | 
            Select-Object @{Name = 'Hostname'; Expression = {$machine.Hostname}},
                          @{Name = 'Computer'; Expression = {$_.Address}},
                          @{Name = 'Online'; Expression = {($_.StatusCode -eq 0)}}

        }
        if ($Online) {
            $pingable | Where-Object { $_.Online } | Select-Object Computer
        } 
        else {
            $pingable | Sort-Object -Descending -Property 'Online'
        }
    }
}

и использовать его как

$servers = Import-Csv -Path 'C:\temp\list.csv'
$servers | Get-Pingables | Export-Csv -Path 'c:\temp\output.csv' -NoTypeInformation

спасибо, но я получаю значение NULL внутри выходного CSV. Я обновил свой вопрос. Оба столбца «Компьютер» остаются пустыми, а столбец «Онлайн» возвращает неверную информацию. На самом деле эти серверы работают.

Arbelac 02.04.2024 18:14

Похоже, что ОП использовал -AsJob, чтобы идти параллельно. Не указано, нужно ли пинговать 7 или 7000 хостов.

lit 02.04.2024 19:21

@Arbelac Пожалуйста, попробуйте исправленный код

Theo 03.04.2024 12:07

Другие вопросы по теме