Echo %var% печатает параметры FINDSTR

В настоящее время я делаю сценарий летучей мыши, чтобы пропинговать хост и вернуть процент потери пакетов, а также среднее значение ms.

Я использую for/f для получения результатов.

Единственное, потеря пакетов и avg ms находятся на двух разных линиях.

Поэтому я использую подвызовы и 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

person Saku    schedule 16.02.2014    source источник


Ответы (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

Перевод твой ребенок...

person Magoo    schedule 16.02.2014
comment
вам не нужно ,6,9,10,11,12. Во всяком случае - хорошее решение. - person Stephan; 16.02.2014
comment
Отлично работает, ти! :) Я добавил датский эквивалент (gennemsnit): code :GetLoss IF "%1"=="Lost" SET loss=%2 %3 %4 IF "%1"=="Tabt" SET loss=%2 %3 %4 GOTO :eof :GetAvg IF "%1"=="Average" SET avg=%2 %3 IF "%1"=="Gennemsnit" SET avg=%2 %3 GOTO :EOF - person Saku; 16.02.2014

@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%

После поиска в изображениях Google я обнаружил, что немецкий вывод ping помещает процент в отдельную строку. То же самое происходит в моем испанском локализованном окне, но не в английских окнах.

Поскольку локализация меняет строки, сначала for | findstr находит две строки с нужными данными. Затем, в зависимости от строки, используется еще один for, чтобы разделить строку там, где это необходимо. В данный момент я не могу протестировать его на другом языке, но он должен работать с небольшими изменениями.

person MC ND    schedule 16.02.2014
comment
Похоже, я все еще получаю результат, где для findstr требуется какой-то файл. code FINDSTR: Cannot open Average FINDSTR: Cannot open Average FINDSTR: Cannot open 0ms - person Saku; 16.02.2014
comment
@user3315027, в коде только одна команда findstr, и в ней нет ни одного из указанных текстов. Только ввод в findstr осуществляется из канала, файл не читается. - person MC ND; 16.02.2014