PowerShell脚本添加Hostname列至CSV输出异常求助
问题解决:为CSV输出每行匹配对应Hostname、IP及在线状态
问题根源
之前的操作错误在于调用函数时,把$servers.RecordData(所有IP的数组)和$servers.Hostname(所有主机名的数组)一次性传入函数,没有建立IP与Hostname的一一对应关系——这会导致函数内的Hostname变量是整个数组,输出时每行都显示所有主机名;后续调整又没正确绑定对应关系,才引发了Computer列空的问题。
修正步骤
1. 调整Get-Pingables函数参数
修改函数,让它接收单个IP地址和对应的单个Hostname,而非整个数组:
function Get-Pingables { param( [Parameter(Mandatory=$true)] [string]$IPAddress, [Parameter(Mandatory=$true)] [string]$Hostname ) $pingResult = Test-Connection -ComputerName $IPAddress -Count 1 -Quiet -ErrorAction SilentlyContinue [PSCustomObject]@{ Hostname = $Hostname IPAddress = $IPAddress Online = $pingResult } }
2. 遍历服务器列表,逐个调用函数
不再一次性传入整个数组,而是循环遍历$servers的每一项,把对应的RecordData(IP)和Hostname传给函数,确保每行数据一一对应:
# 假设$servers是包含Hostname和RecordData的集合(比如从DNS查询获取) $results = foreach ($server in $servers) { Get-Pingables -IPAddress $server.RecordData -Hostname $server.Hostname } # 导出到CSV $results | Export-Csv -Path ".\PingResults.csv" -NoTypeInformation
示例验证
输入示例($servers集合)
$servers = @( [PSCustomObject]@{Hostname = "Server01"; RecordData = "192.168.1.10"}, [PSCustomObject]@{Hostname = "Server02"; RecordData = "192.168.1.11"}, [PSCustomObject]@{Hostname = "Server03"; RecordData = "192.168.1.12"} )
输出CSV内容(正确格式)
"Hostname","IPAddress","Online" "Server01","192.168.1.10","True" "Server02","192.168.1.11","False" "Server03","192.168.1.12","True"
常见错误规避
- 禁止直接传入数组参数:如果函数接收数组类型参数,会导致单条输出绑定整个数组值,必须确保每次处理单个IP-Hostname对。
- 必须遍历集合每一项:使用
foreach ($item in $collection)而非批量传递,才能保证IP和Hostname的关联准确性。
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

