优化15万+主机名的PowerShell IP查询脚本,添加运行状态反馈
改进PowerShell DNS查询脚本:大列表处理的状态反馈与增量写入
针对处理15万+主机名时无运行反馈、风险高的问题,以下是修改后的脚本,实现每200条增量写入CSV+实时状态提示,同时优化内存占用:
# 配置参数 $inputPath = "./FULl_List_hosts_all_CSV_V2.txt" $outputPath = "./pingstatus.csv" $batchSize = 200 # 每处理多少条写入一次CSV # 初始化变量 $Servers = Get-Content -Path $inputPath $totalCount = $Servers.Count $counter = 0 $failCount = 0 $batchData = @() # 提前清空输出文件(避免追加旧数据) if (Test-Path $outputPath) { Remove-Item $outputPath -Force } foreach($Server in $Servers) { $Server = $Server.Trim() $counter++ try { $DNSCheck = [System.Net.Dns]::GetHostEntry($Server) $ipv4 = ($DNSCheck.AddressList | Where-Object {$_.AddressFamily -eq 'InterNetwork'})[0].IPAddressToString $batchData += [PsCustomObject]@{ 'Server name' = $Server 'IP Address' = $ipv4 } } catch { $failCount++ $batchData += [PsCustomObject]@{ 'Server name' = $Server 'IP Address' = 'n/a' } } # 实时输出状态 Write-Host "处理进度: $counter/$totalCount | 失败数: $failCount | 当前主机: $Server" -ForegroundColor Cyan # 每处理batchSize条,写入CSV并清空临时数组 if ($counter % $batchSize -eq 0) { Write-Host "已完成$counter条,正在写入CSV..." -ForegroundColor Green if (-not (Test-Path $outputPath)) { $batchData | Export-Csv -Path $outputPath -NoTypeInformation } else { $batchData | Export-Csv -Path $outputPath -Append -NoTypeInformation } $batchData = @() # 清空临时数组释放内存 } } # 处理剩余不足batchSize的条目 if ($batchData.Count -gt 0) { Write-Host "处理完成,写入剩余$($batchData.Count)条数据..." -ForegroundColor Green if (-not (Test-Path $outputPath)) { $batchData | Export-Csv -Path $outputPath -NoTypeInformation } else { $batchData | Export-Csv -Path $outputPath -Append -NoTypeInformation } } Write-Host "全部处理完成!总数量: $totalCount | 失败数: $failCount" -ForegroundColor Yellow
关键改动说明
- 增量写入机制:用临时数组
$batchData存储批次数据,每满200条写入CSV并清空数组,避免15万条数据全部占用内存 - 实时状态反馈:通过
Write-Host输出当前处理进度、失败统计和正在处理的主机名,随时确认脚本运行状态 - 参数化配置:把路径、批次大小做成变量,方便后续调整(比如把
$batchSize改成500提升写入效率) - 初始化清理:提前删除旧的输出文件,避免追加重复数据
- 收尾处理:循环结束后检查剩余未写入的批次数据,确保全部导出
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

