2014-02-16 115 views
0

我目前正在制作一个bat脚本,来ping主机,并返回Packetloss百分比和平均ms。Echo%var%打印FINDSTR参数

我正在使用/ f来获得结果。

唯一的问题是,数据包丢失和平均ms在两条不同的线路上。

因此,我使用subcalls和findstr为每个设置一个变量。

但是,当我试图再次调用该变量时,它包含了findstr命令的所有参数。

我该怎么办?

下面的代码:

@echo off 
SETLOCAL 
SET PingCMD=ping.exe -w 300 -n 1 127.0.0.1 
FOR /f "tokens=3,6,9,10,11,12 delims=," %%A IN ('%PingCMD%') DO (

    call :GetLoss %%A 
    call :GetAvg %%A 

) 
echo PacketLoss %loss% Average %avg% 
pause 


:GetLoss 
SET loss=%1 %2 %3 %4 ^| findstr "loss tab" 
GOTO :eof 

:GetAvg 
SET avg=%1 %2 %3 ^| findstr "Average Gennemsnit average gennemsnit" 
GOTO :eof 
EndLocal 

回答

2
@ECHO OFF 
SETLOCAL 
SET PingCMD=ping.exe -w 300 -n 1 127.0.0.1 
FOR /f "tokens=3,6,9,10,11,12 delims=," %%A IN ('%PingCMD%') DO (

    call :GetLoss %%A 
    call :GetAvg %%A 

) 
echo PacketLoss %loss% Average %avg% 
PAUSE 
GOTO :eof 


:GetLoss 
IF "%1"=="Lost" SET loss=%2 
GOTO :eof 

:GetAvg 
IF "%1"=="Average" SET avg=%2 
GOTO :EOF 

翻译的宝宝...

+0

你不需要',6,9,10,11,12'。无论如何 - 好的解决方案。 – Stephan

+0

工程很好,ty! :) 我已经添加,丹麦equivalant(gennemsnit): '代码 :GetLoss IF “%1” == “迷失” SET损失=%2%3%4 IF “%1” == “Tabt”SET损失=%2%3%4 GOTO:eof :GetAvg 如果“%1”==“Average”SET avg =%2%3 如果“%1”==“Gennemsnit”SET avg =%2%3 GOTO:EOF ' – Saku

0
@echo off 

    setlocal enabledelayedexpansion 

    set "pingCMD=ping -w 300 -n 1 127.0.0.1" 
    set "pct=" 
    set "avg=" 
    for /f "tokens=*" %%a in ('%pingCMD% ^| findstr /n /r /c:"([0-9]*%%" /c:"= [0-9]*ms" ') do (
     if not defined pct (
       for /f "tokens=2 delims=(%%" %%b in ("%%a") do set "pct=%%b" 
     ) else (for /f "tokens=7 delims=,= " %%b in ("%%a") do set "avg=%%b") 
    ) 
    echo %pct% %avg% 

在谷歌图片搜索后,我发现,德平输出使百分比在一个单独的线。我的西班牙语本地化窗口中发生的情况也是如此,但不是在英文窗口中。

由于本地化改变了行,所以第一个for | findstr找到了需要数据的两行。然后,根据行的不同,使用另一个for来拆分所需的行。在这个时候,我不能用另一种语言来测试它,但是这应该只需要很小的改变。

+0

看来,我仍然得到结果,其中findstr需要某种文件。 '代码 FINDSTR:无法打开平均 FINDSTR:无法打开平均 FINDSTR:无法打开0毫秒 ' – Saku

+0

@ user3315027,在代码中只有一个'findstr'命令,它不包括没有显示的文本。只有输入到findstr来自管道,没有文件读取。 –