1

下面的代码会将计算机名称和 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
4

2 回答 2

3

如果未找到“回复” ,您可以使用设置的错误级别findstr替换返回字符串:

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

其中||(由于for上下文而在此处转义^)表示仅在上一个命令失败时才执行。

作为旁注,您应该知道ping消息取决于系统语言(它们被翻译为操作系统的语言),因此“回复”作为成功指示器仅适用于英文版本。

于 2012-12-12T13:39:50.263 回答
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 并回显主机和 IP,否则回显主机名和输出字符串。

于 2018-01-31T11:24:15.910 回答