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
我想执行 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