我正在编写一个脚本来 ping 学校内的 WAP 和交换机,它上面的一切都运行良好,除了它不会将没有响应传输到 .txt 中,因为我添加了
| FIND "TTL="
这基本上就是我的脚本,除了所有 IP 的多行内容之外
@echo off
del Test.txt
set /p var1=How many times would you like to test the connection for each device?
cls
echo Testing WAP Connections, Please Wait...
ping -n %var1% 127.0.0.1 | FIND "TTL=" > Test.txt
当我使用脚本的“FIND”部分运行脚本时,我得到了这个输出
Reply from 127.0.0.1: bytes=32 time<1ms TTL=255
但是如果我没有收到任何我 ping 的回复,它就不会在 .txt 文件中记录它。有什么方法可以让它记录失败的 ping,而不必删除:“| FIND "TTL="”?
答案1
有什么方法可以让它记录失败的 ping,而不必摆脱:“| FIND“TTL=””?
不,至少不使用微软的股票find
命令。
以下是一些文档find
在客户端,适用于 Windows Vista 和 Windows 8,其中部分内容如下:
如果你不使用/我,寻找搜索您指定的内容细绳。
由于您只能指定一个细绳寻找,没有直接的去做你想做的事情的方法。
但是,您可以用一种稍微迂回的方式来做到这一点:将输出重定向ping
到临时文件,然后运行find
两次在该文件上:
ping -n %var1% 127.0.0.1 > Test.tmp
FIND "TTL=" Test.tmp > Test.txt
FIND "Request timed out." Test.tmp >> Test.txt
或者,您可以使用支持搜索多个不同字符串的工具,例如 GNU grep
(适用于 Win32)。评论中指出的另一种方法是和31415而是使用findstr
在 Windows 2000 和更新版本中可用的命令:
ping -n %var1% 127.0.0.1 | findstr /c:"TTL=" /c:"Request timed out."
显然,由于这两种语言都是通过查看母语输出来进行操作的,因此ping
它们在非英语地区会遇到问题。
值得铭记那find
起源于 DOS 2.0.那是与引入目录和硬盘支持的 DOS 版本相同(DOS 1.x 仅支持使用软盘进行持久存储,并且缺乏目录的概念)。由于向后兼容性是 Microsoft 仍然非常重视的事情,因此他们无法轻易改变如何find
对待细绳参数,而在 DOS 2.0 时代,内存和处理速度都非常宝贵。看来find
DOS 2.x 中的 甚至不支持不区分大小写的搜索(后来通过开关添加/I
)。它真的是一个神秘的实用程序,之所以幸存下来,是因为它不能轻易被其他东西取代。
答案2
解决方法
搜索.
而不是TTL=
:
ping -n %var1% 127.0.0.1 | FIND "." > Test.txt
由于您不是在寻找特定的文本,因此此方法应该在大多数 Windows 语言环境中都有效,无需额外努力即可捕获多条错误消息。
示例输出
Pinging 127.0.0.1 with 32 bytes of data:
Reply from 127.0.0.1: bytes=32 time<10ms TTL=128
Ping statistics for 127.0.0.1:
请求超时
Pinging 1.2.3.4 with 32 bytes of data:
Request timed out.
Ping statistics for 1.2.3.4:
目标主机不可达
Pinging 131.107.255.255 with 32 bytes of data:
Reply from 10.0.2.15: Destination host unreachable.
Ping statistics for 131.107.255.255:
总体故障
Pinging 127.0.0.0 with 32 bytes of data:
General failure.
Ping statistics for 127.0.0.0:
传输失败
Pinging 0.0.0.0 with 32 bytes of data:
PING: transmit failed. General failure.
Ping statistics for 0.0.0.0:
找不到主机
Ping request could not find host a.b.c.d. Please check the name and try again.