
我有一个 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
可以使用ping
PowerShell 命令来解析输出并将其格式化为 CSV 文件。
CSV 中的每一行代表一个目标,包含两列表示目标的名称及其相关延迟(以毫秒为单位)。若未收到响应,则延迟列将显示100% loss
。
首先,它会将ping
结果存储在一个变量中,并应用match operator
识别关键行(即"Reply from|100% Loss"
)。然后,它使用split
,replace
, 和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