【问题标题】:How to properly pass FOR /F to variables in batch file?如何正确地将 FOR /F 传递给批处理文件中的变量?
【发布时间】:2017-07-18 07:31:05
【问题描述】:

我正在尝试制作一个执行 ping 并将一些结果存储为变量的批处理文件。我正在尝试存储发送、接收、丢失的数据包以及最小、最大平均延迟。

我已经设法做到了,尽管使用了单独的 ping 命令,因此每个变量中的结果来自单独的数据集并且彼此不相关:

@ECHO OFF

FOR /F "tokens=4 delims=, " %%A IN ('ping -n 2 8.8.4.4 ^| findstr /R "^Packets: Sent =.$"') DO SET SENTPACKETS=%%A
ECHO Packets sent: %SENTPACKETS%

FOR /F "tokens=7 delims=, " %%A IN ('ping -n 2 8.8.4.4 ^| findstr /R "^Packets: Sent =.$"') DO SET RECEIVEDPACKETS=%%A
ECHO Packets received: %RECEIVEDPACKETS%

FOR /F "tokens=10 delims= " %%A IN ('ping -n 2 8.8.4.4 ^| findstr /R "^Packets: Sent =.$"') DO SET LOSTPACKETS=%%A
ECHO Packets lost: %LOSTPACKETS%

FOR /F "tokens=4 delims=,m " %%A IN ('ping -n 2 8.8.4.4') DO SET MINIMUMLATENCY=%%A
ECHO Minimum latency: %MINIMUMLATENCY%

FOR /F "tokens=9 delims=,m " %%A IN ('ping -n 2 8.8.4.4') DO SET MAXIMUMLATENCY=%%A
ECHO Maximum latency: %MAXIMUMLATENCY%

FOR /F "tokens=13 delims=,m " %%A IN ('ping -n 2 8.8.4.4') DO SET AVERAGELATENCY=%%A
ECHO Average latency: %AVERAGELATENCY%

pause

所以为了尝试解决这个问题并从同一个 ping 命令中收集所有变量,我尝试将结果存储在一个 .txt 文件中,如下所示:

@echo off

ping 8.8.4.4>c:\data.txt

FOR /F "tokens=3 delims= " %%A IN (c:\data.txt) DO SET SENTPACKETS=%%A
ECHO Packets sent: %SENTPACKETS%

FOR /F "tokens=7 delims= " %%A IN (c:\data.txt) DO SET RECEIVEDPACKETS=%%A
ECHO Packets received: %RECEIVEDPACKETS%

FOR /F "tokens=10 delims= " %%A IN (c:\data.txt) DO SET LOSTPACKETS=%%A
ECHO Packets lost: %LOSTPACKETS%

FOR /F "tokens=4 delims=,m " %%A IN (c:\data.txt) DO SET MINIMUMLATENCY=%%A
ECHO Minimum latency: %MINIMUMLATENCY%

FOR /F "tokens=9 delims=,m " %%A IN (c:\data.txt) DO SET MAXIMUMLATENCY=%%A
ECHO Maximum latency: %MAXIMUMLATENCY%

FOR /F "tokens=13 delims=,m " %%A IN (c:\data.txt) DO SET AVERAGELATENCY=%%A
ECHO Average latency: %AVERAGELATENCY%

pause

我知道我的最小、最大、平均延迟数据是正确的,也许丢失的数据包数量(我不确定那个),但发送和接收的数据包数量是没有从正确的“令牌”中读取,无论我尝试什么,我似乎都无法从 data.txt 中的正确行读取它

有什么想法吗?

【问题讨论】:

    标签: batch-file cmd


    【解决方案1】:

    首先,使用

    @echo off
    
    >c:\data.txt ping 8.8.4.4
    

    直接在重定向器重定向该标准设备号之前作为数字,而不是stdout

    然后将前3项中的文件名单独替换为

    'findstr /R "^Packets: Sent =.$" c:\data.txt'
    

    从文件中选择适当的行。您需要确保 tokensdelims 选项与您发布的第一个例程中的选项匹配(第一个使用标记 4 和 delims , 但您的第二个例程使用标记 3 和 delims 作为单独的空间) - 也就是说,假设您的第一个代码可以令人满意地工作。

    显然,前 3 个数据项的过滤器和选择具有不同的过滤器,因此需要将其应用于所有条目。

    接下来,在要执行的命令中添加2^>nul 'findstr /R "^Packets: Sent =.$" c:\data.txt 2^>nul' 以抑制讨厌的消息,并记住,如果您首先初始化您使用的变量,那么如果文件未能出现在文件中,则最初分配给的值该变量是“未找到”消息。

    哦,尝试编辑您的帖子以包含典型的ping 结果和生成的报告以及报告应该如何阅读的说明。

    【讨论】:

      【解决方案2】:

      Magoo 的代码运行良好!

      @echo off
      
      ping -n 100 8.8.4.4>c:\data.txt
      
      for /f "tokens=4 delims=, " %%A IN ('findstr /R "^Packets: Sent =.$" c:\data.txt 2^>nul') do set sentpackets=%%A
      echo Packets sent: %sentpackets%
      
      for /f "tokens=7 delims=, " %%A IN ('findstr /R "^Packets: Sent =.$" c:\data.txt 2^>nul') do set receivedpackets=%%A
      echo Packets received: %receivedpackets%
      
      for /f "tokens=10 delims= " %%A IN ('findstr /R "^Packets: Sent =.$" c:\data.txt 2^>nul') do set lostpackets=%%A
      echo Packets lost: %lostpackets%
      
      for /f "tokens=4 delims=,m " %%A IN (c:\data.txt) do set minimumlatency=%%A
      echo Minimum latency: %minimumlatency%
      
      for /f "tokens=9 delims=,m " %%A IN (c:\data.txt) do set maximumlatency=%%A
      echo Maximum latency: %maximumlatency%
      
      for /f "tokens=13 delims=,m " %%A IN (c:\data.txt) do set averagelatency=%%A
      echo Average latency: %averagelatency%
      
      pause
      

      很遗憾,我无法让 LotPings 的代码正常工作,但我很感激您的回复。谢谢。

      【讨论】:

        【解决方案3】:
        @Echo off
        :: clear variables
        For %%A in (LatMin LatMax LatAvg PacSnt PacRcv PacLos) Do Set "%%A="
        :: do the ping
        For /f "tokens=1-8 delims=:=, " %%A in (
            'ping 8.8.4.4 2^>Nul ^| findstr "Pa Min"'
        ) Do If "%%A"=="Packets" (
            SET PacSnt=%%C
            SET PacRcv=%%E
            SET PacLos=%%G
        ) Else If "%%A"=="Minimum" (
            SET LatMin=%%B
            SET LatMax=%%D
            SET LatAvg=%%F
        )
        ECHO Packets sent    : %PacSnt%
        ECHO Packets received: %PacRcv%
        ECHO Packets lost    : %PacLos%
        
        ECHO Minimum latency : %LatMin:~0,-2%
        ECHO Maximum latency : %LatMax:~0,-2%
        ECHO Average latency : %LatAvg:~0,-2%
        

        【讨论】:

        • 不幸的是,这对我根本不起作用。我将代码复制并粘贴到批处理文件中,并使用 admin cmd 对其进行了测试。发送、接收和丢失的数据包显示为空白,最小、最大、平均延迟都显示为 ~0、-2。还是谢谢你。
        • 抱歉,我上次的编辑应该抑制 ping 错误,但抑制了一切。已更正。
        猜你喜欢
        • 1970-01-01
        • 2015-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-13
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        相关资源
        最近更新 更多