【问题标题】:Windows cmd: Parsing output from PingWindows cmd:解析 Ping 的输出
【发布时间】:2021-05-27 17:58:21
【问题描述】:

我想执行 ping,并在评估输出后返回一行,如“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 循环在设置变量和稍后访问它们方面可能会很棘手。

非常感谢任何帮助。

致以最诚挚的问候,亲爱的

【问题讨论】:

  • 你没有!loss!。你定义了!loss !。使用set 命令删除= 周围的所有空格。
  • 这将有助于我们为您提供更有针对性的帮助,如果您要在edit 您的问题中包含一些示例ping.exe 输出,以便我们可以准确地确定您想要什么从中提取。您还应该打开命令提示符窗口,键入for /?,然后按[ENTER] 键,以了解如何使用标记和分隔符。 "tokens=* delims= " 是错误的,"tokens=1,2,3,4,5,6 delims==(%%" 也是如此。您可能还应该删除set line=%%f,使用call :processLine "%%f",并将%line% 替换为%~1
  • 谢谢你的解决方案,斯蒂芬。感谢您的建设性补充,Compo。
  • 嗯,谁能告诉我在哪里将答案标记为解决方案?
  • 没有人回答您的问题,他们只提供了可能帮助您解决问题和/或改进代码的 cmets。我建议你自己回答这个问题,展示你的新代码,并尽可能地解释它是如何做到的。您可以在发布后,并且已经过了足够的时间,也可以将您自己的答案标记为已接受的解决方案。

标签: parsing batch-file cmd ping


【解决方案1】:

这是一个不需要延迟扩展的示例,并且为了提高效率,使用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

【讨论】:

    【解决方案2】:

    以下代码可以满足我的要求。仍然有错误(“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!
        )
    )
    

    【讨论】:

    • 很好地遵循了建议并提供了您的解决方案。我还发布了一些你可能会觉得有用的东西。
    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 2017-08-06
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    相关资源
    最近更新 更多