PowerShell:将 Ping 结果导出到 CSV

PowerShell:将 Ping 结果导出到 CSV

我有一个 PowerShell 循环,可以有效地完成我想要的工作。问题是输出非常混乱。我在一家 ISP 工作,我们诊断网络问题的最有效方法之一是通过多次 ping。

问题是设置多个 ping 可能会很麻烦。我不想重新发明轮子,而是想创建一个简单的 PowerShell 脚本,该脚本将根据 IP 地址列表提供易于理解的输出。

这是我目前拥有的代码:

# Define a list of IP addresses and hostnames to ping
$targets = Get-Content -Path C:\Users\Chad\Desktop\IPs.txt

# Loop through each target and ping it
 while (1) {
    foreach ($target in $targets) {
        ping $target -n 1

    }
}

我不会说我的代码特别优雅或具有开创性。我只想知道是否有办法将 ping 结果导出到 .csv 文件,其中每列代表一个 IP 地址,行代表每个特定 ping 的延迟。

我的想法是,我可以培训我的同事如何使用这个脚本,并且只有在手动停止 ping 后才会打开 .csv。我完全愿意重新制定解决这个问题的方法。

任何帮助都将不胜感激!

答案1

尝试使用 powershellTest-Connection来输出方便的对象:

$targets = Get-Content -Path C:\Users\Chad\Desktop\IPs.txt

# Loop through each target and ping it
# I use -AsJob to force failed pings to get included in results
$job = Test-Connection -ComputerName $targets -Count 1 -AsJob
$results = $job | Wait-Job | Receive-Job

$results | Export-CSV c:\folder\results.csv

好像

Source    Destination   IPV4Address   IPV6Address Bytes Time(ms)
------    -----------   -----------   ----------- ----- --------
MyDevice  bogus                                   32            
MyDevice  myServer1     10.0.0.2                  32    65      
MyDevice  MyServer2     10.0.0.3                  32    68      

答案2

首先,您将使用 PowerShell 本机命令[Test-Connection][1]。这是旧版 ping.exe 的 PS 版本,它是本机 PS,因此具有所有很酷的对象功能和输出功能。

最简单的一行代码是:

test-connection hostname | Export-Csv path\to\csv.csv

这将对主机运行 ping 并将结果记录到指定的 csv 文件中。

您可以通过获取 ping 行并进行如下修改来转换脚本:

Test-Connection $target -Count 1 | Export-CSV "c:\results\$target.csv"

这将针对指定的每个目标运行一次 ping,并将结果记录在以目标命名的 csv 文件中。

您还可以设置一个数组(一个值列表的变量)并捕获其中的每个结果,然后将其放入单个输出文件中。

答案3

可以使用pingPowerShell 命令来解析输出并将其格式化为 CSV 文件。

CSV 中的每一行代表一个目标,包含两列表示目标的名称及其相关延迟(以毫秒为单位)。若未收到响应,则延迟列将显示100% loss

首先,它会将ping结果存储在一个变量中,并应用match operator识别关键行(即"Reply from|100% Loss")。然后,它使用splitreplace, 和trim条件内的逻辑if语句来解析和处理相关数据到 CSVout-file

而不是引入额外的复杂性pscustomobject为了使用export-csv,这种方法仅使用三行代码,同时保留了现有的匹配逻辑,保持了简单性。

电源外壳

# Define a list of IP addresses and hostnames to ping
$targets = Get-Content -Path C:\Users\Chad\Desktop\IPs.txt
$csvFile = "C:\Users\Chad\Desktop\IPs.csv"

# Loop through each target and ping it
 while (1) {
    foreach ($target in $targets) {
        $p = (ping $target -n 1) -match "Reply from|100% Loss"
        If($p -match "Reply from"){"$target,$($p.split('=')[2].replace('TTL','').Trim())" | Out-File "$csvFile" -Append}
        If($p -match "100% Loss"){"$target,100% loss" | Out-File "$csvFile" -Append} 
    } 
}

输出示例

8.8.8.8,11ms
12.34.56.78,100% loss
whoisyourmomma.com,28ms
www.cia.gov,3ms

相关内容