2014-02-16 48 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來自管道,沒有文件讀取。 –