我需要使用 -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%
返回百分之一秒