下面的代码会将计算机名称和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
答案 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,否则回显主机名和输出字符串。