Windows cmd:解析 Ping 的输出

Windows cmd: Parsing output from Ping

我想执行 ping,在评估输出后,return 像“0 - check_ping rta=1 loss=0”这样的单行。

0 和 1 当然是从 ping 中提取的。

我已经走到这一步了:

@setlocal enableextensions enabledelayedexpansion
@echo off

set ip=%1
set num=%2

for /f "tokens=* delims= " %%f in ('ping -n %num% %ip%') do (
  set line=%%f
  call :processLine
  )

echo 0 myTestService loss=!loss! rta=%rta:~1,-2% further information for myTestService
GOTO:EOF

:processLine
for /f "tokens=1,2,3,4,5,6 delims==(%%" %%A in ("%line%") do (
    if "%%A" == "Packets: Sent " (
        set loss = %%E
        echo DD%%E
        echo Loss is [!loss!]
    )
    if "%%A" == "Minimum " (
        set rta=%%D
        echo RTA is [!rta:~1,-2!]
    )
)

它不起作用,我认为这是因为一些运行时问题。显然我不是 cmd 专家,但我读到那些 for 循环在设置变量和稍后访问它们方面可能很棘手。

非常感谢任何帮助。

最诚挚的问候,freiraum

下面的代码完成了我想要的。仍然有错误 ("tokens=* delims= "),但这些似乎可以忽略不计 - 至少我希望如此。

@setlocal enableextensions enabledelayedexpansion
@echo off

set ip=%1
set num=%2

for /f "tokens=* delims= " %%f in ('ping -n %num% %ip%') do (
  call :processLine "%%f"
  )

echo 0 myTestService loss=!loss:~1! rta=!rta:~0,-2! further information for myTestService
GOTO:EOF

:processLine
for /f "tokens=1,9,11 delims= " %%A in ("%~1") do (
    
    if "%%A" == "Packets:" (
        set loss=%%C
        rem echo Loss is !loss:~1!
    )
    if "%%A" == "Minimum" (
        set rta=%%B
        rem echo RTA is !rta:~0,-2!
    )
)

这是一个不需要延迟扩展的示例,为了提高效率,使用 find.exe 来仅处理您希望从中提取子字符串的行,而不 call标签:

@Echo Off
SetLocal EnableExtensions
If "%~2" == "" Exit /B
Set "loss="
For /F "Tokens=6,8 Delims== " %%G In ('%SystemRoot%\System32\PING.EXE -n %~2 %~1
 ^| %SystemRoot%\System32\find.exe ","') Do If Not Defined loss (Set "loss=%%H"
) Else Set "rta=%%G"
If Not Defined loss Exit /B
Echo 0 myTestService loss=%loss:~1,-1% rta=%rta:~,-2% further information for myTestService