Windows bat 文件:如何使用 for 循环实时处理 ping.exe 的输出?

Windows bat 文件:如何使用 for 循环实时处理 ping.exe 的输出?

我需要使用 -t 参数运行 ping 并处理 bat 脚本中的每一行。我需要实时执行此操作。

这段代码解释了我的问题。命令“ping -t 8.8.8.8”不会在 for 循环中打印任何内容,因此控制台中也不会打印任何内容。如果我使用“ping -n 10 8.8.8.8”,则 ping 退出时会同时打印所有行。

我怎样才能将实际打印的行放入 for 循环中?

@echo off
Setlocal EnableDelayedExpansion
FOR /f "TOKENS=*" %%i in ('ping -t 8.8.8.8') do (
 set LINE=%%i
 echo !LINE!
)

答案1

正如注释中所述,该FOR命令无法处理正在进行的输出;一旦进程终止,它就会处理一组数据。

每次执行 ping 时,您只需要生成一组输出即可捕获每个结果。您还需要将结果集限制为 ping 结果并忽略其他行。

find 命令将仅返回包含所 ping 地址的结果(此处需要使用 IP)

SKIP选项将绕过返回的第一行Ping对 IP 地址的引用。

在命令主体中,For您将标记存储到临时变量中以便在For循环外进行处理。

Goto :l_Break_Loop将循环仅接受来自命令的一行输出Ping并跳转到数据处理部分。

之后,Goto :l_Start_Loop将批处理文件引导至循环顶部以获取另一行 ping 数据。

@echo off
Setlocal EnableDelayedExpansion
:l_Start_Loop
FOR /f "SKIP=1 TOKENS=*" %%i in ('ping -n 1 8.8.8.8 2^>&1 ^| Find /i "8.8.8.8"') do (
 set LINE=%%i
 echo !LINE!
 Goto :l_Break_Loop
)
:l_Break_Loop
REM Start processing data retrieved from ping result

REM End processing data retrieved from ping result
Goto :l_Start_Loop

您可以使用计时器函数在 ping 尝试之间施加延迟,并且通过对变量进行一些巧妙的操作,%TIME%您甚至可以让 ping 命令定期运行,只要延迟时间长于 ping 和处理结果的时间。

%TIME:~-8,2%返回分钟
%TIME:~-5,2%返回秒
%TIME:~-2%返回百分之一秒

相关内容