批量ping计算机名称列表并将结果写入文件

时间:2012-12-12 01:13:25

标签: for-loop batch-file ping

下面的代码会将计算机名称和IP地址写入文件,但我希望它还能写下它无法ping通的计算机名称,并且旁边有一个失败。我不知道如何修改批处理文件来执行此操作。

@echo off

Echo Pinging list...

set ComputerList=list.txt

Echo Computername,IP Address>Final.csv
setlocal enabledelayedexpansion

for /f "usebackq tokens=*" %%A in ("%ComputerList%") do (
for /f "tokens=3" %%B in ('ping -n 1 -l 1 %%A ^|findstr Reply') do (
set IPadd=%%B
echo %%A,!IPadd:~0, -1!>>Results.csv
))

pause

2 个答案:

答案 0 :(得分:3)

如果找不到“回复”,您可以使用findstr设置的errorlevel替换返回字符串:

('ping -n 1 -l 1 %%A ^|findstr Reply ^|^| echo Not found Failed:')  

其中||(由于带有for的{​​{1}}上下文而在此处转义)表示仅在上一个命令失败时执行。

作为旁注,您应该知道^消息依赖于系统语言(它们被翻译为OS语言),因此“回复”作为成功指示仅适用于英语版本。

答案 1 :(得分:0)

这可能不是您正在寻找的,但我有类似的任务:运行ping并报告成功或失败。我将把IP地址提取给你 - 看你已经完成了。

ping的问题在于它在名称解析时返回成功,无论数据包丢失还是主机无法访问(将报告0%丢失)都无关紧要。

FOR %%a IN (
 google.com
 a.b.c.d
) DO @FOR /F "delims=" %%p IN (
     'PING -w 100 -n 1 %%a ^| findstr ^"Reply Request fail name^"'
   ) DO @(
     ECHO "%%p" | FINDSTR TTL >2 && echo %%a, success, %%p || echo %%a, failed, %%p
   ) >> Results.csv

逻辑:Ping一次,仅过滤带有列出的单词之一的行。如果结果行中存在TTL(输出到STDERR或NUL以避免输出污染)回声成功,否则回声失败。

我在英语Windows上,必须为其他语言调整单词。

编辑:

FOR %%a IN (
 google.com
 a.b.c.d
) DO @FOR /F "delims=" %%p IN ('PING -n 1 %%a ^| findstr TTL ^|^| echo Failed') DO @(
       ECHO "%%p" | FINDSTR TTL >2 && (for /f "tokens=3" %%b IN ("%%p") do @echo %%a, %%b) || echo %%a, failed, %%p
     )

较少依赖语言,仅适用于IPv4,添加了IP提取。 过滤TTL的ping输出,将输出设置为"失败"如果找不到TTL。 如果输出字符串包含TTL,则提取IP和echo主机和IP,否则回显主机名和输出字符串。