Мне нужно добавить имя хоста в каждую строку, как показано ниже.
во-первых, я добавил параметр 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"





Возможно, вам будет лучше работать с 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, а затем разберитесь со свойствами внутри функции.
Я считаю, что было бы лучше, если бы функция работала с объектами, созданными 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. Я обновил свой вопрос. Оба столбца «Компьютер» остаются пустыми, а столбец «Онлайн» возвращает неверную информацию. На самом деле эти серверы работают.
Похоже, что ОП использовал -AsJob, чтобы идти параллельно. Не указано, нужно ли пинговать 7 или 7000 хостов.
@Arbelac Пожалуйста, попробуйте исправленный код
«Имя хоста», «Компьютер», «В сети» «System.String[]», «10.xx.xx.xx», «False» «System.String[]», «10.xx.xx.xx.xx ","False" возвращает system.String в качестве имени хоста.