Постоянный пакетный файл ping с выходом .csv не работает правильно - PullRequest
0 голосов
/ 09 февраля 2019

У меня проблемы с Интернетом, и я хотел создать фоновый скрипт, который устанавливает постоянный пинг для моего маршрутизатора и Интернета, чтобы я мог отслеживать частоту разрыва соединения.

Что мне удалось сделать, так этосоздать пакетный файл, который выполняет постоянный пинг для моего маршрутизатора и Интернета, получает время отклика, а затем создает вывод в консоли, а также файл CSV с несколькими полями, такими как время пинга состояния (т. е. успешный пинг или сбой),дата пинга и т. д.

У меня проблема в том, что у меня не выдается код, если соединение обрывается, и я думаю, это потому, что введенная мною переменная %errorlevel% не работает из-за прерывания вывода пингаи хранится в переменной, но я могу ошибаться, и именно поэтому я здесь объясняю свою проблему.

Я пробовал несколько различных методов, но не могу найти тот, где я могу сохранить время ответа в переменной Ион должен обеспечить правильный уровень ошибки, чтобы перейти к выводу правильных данных с одного и того же пинга

Кажется, сейчас я могу заставить его сделать только одно:

@ECHO OFF
@SETLOCAL

set internetAddress=8.8.8.8
set routerAddress=192.168.1.0
set speed=2
set filename=C:\PingTest\PingResults\PingTest_%time:~0,2%%time:~3,2%%time:~6,2%_%date:~-10,2%%date:~-7,2%%date:~-4,4%.csv

echo Type, Status, Time, Date, ms >> %filename%
echo off

:internetstart

set currentTime=%time:~0,2%:%time:~3,2%:%time:~6,2%
set currentDate=%date:~-10,2%/%date:~-7,2%/%date:~-4,4%

for /F "tokens=7 delims==< " %%G in ('
ping -4 -n 1 %internetAddress%^|findstr /i "TTL="') do (

set ims=%%G 
if %errorlevel% == 0 goto :internetSuccess
if not %errorlevel% == 0 goto :internetFail
)

:internetSuccess

echo internet = success @ %ims% - %currentTime% %currentDate%
echo internet, success, %currentTime%, %currentDate%, %ims% >> %filename%
PING localhost -n %speed% >NUL
goto :routerstart

:internetFail
set ims=n/a
echo internet = failure @ %ims% - %currentTime% %currentDate%
echo internet, failure, %currentTime%, %currentDate%, %ims% >> %filename%
PING localhost -n %speed% >NUL
goto :routerstart

:routerstart

for /F "tokens=7 delims==< " %%A in ('
ping -4 -n 1 %routerAddress%^|findstr /i "TTL="') do (

set rms=%%A 
if %errorlevel% == 0 goto :routerSuccess
if not %errorlevel% == 0 goto :routerFail
)

:routerSuccess
echo router   = success @ %rms% - %currentTime% %currentDate%
echo router, success, %currentTime%, %currentDate%, %rms% >> %filename%
PING localhost -n %speed% >NUL
goto :internetstart

:routerFail
set rms=n/a
echo router   = failure @ %rms% - %currentTime% %currentDate%
echo router, failure, %currentTime%, %currentDate%, %rms% >> %filename%
PING localhost -n %speed% >NUL
goto :internetstart

Ожидаемые результаты в файле CSV:

Если ping успешно:

|TYPE     | STATUS  |TIME      | DATE       | MS |
|internet | success | 00:00:00 | 31/12/9999 | 7ms|
|router   | success | 00:00:00 | 31/12/9999 | 1ms|

Если ping не удалось:

|TYPE     | STATUS  |TIME      | DATE       | MS |
|internet | failure | 00:00:00 | 31/12/9999 | n/a|
|router   | failure | 00:00:00 | 31/12/9999 | n/a|

Текущие результаты:

Если ping успешно:

|TYPE     | STATUS  |TIME      | DATE       | MS |
|internet | success | 00:00:00 | 31/12/9999 | 7ms|
|router   | success | 00:00:00 | 31/12/9999 | 1ms|

Если ping не удается:

|TYPE     | STATUS  |TIME      | DATE       | MS |
|internet | success | 00:00:00 | 31/12/9999 | 7ms|
|router   | success | 00:00:00 | 31/12/9999 | 7ms|

Ответы [ 3 ]

0 голосов
/ 09 февраля 2019

Я бы предложил следующий код для этой задачи:

@echo off

set "internetAddress=8.8.8.8"
set "routerAddress=192.168.1.1"
set "speed=2"
set "filename=C:\PingTest\PingResults\PingTest_%time:~0,2%%time:~3,2%%time:~6,2%_%date:~-10,2%%date:~-7,2%%date:~-4,4%.csv"

(echo Type, Status, Time, Date, ms)>>%filename%

:internetstart
set "currentTime=%time:~0,2%:%time:~3,2%:%time:~6,2%"
set "currentDate=%date:~-10,2%/%date:~-7,2%/%date:~-4,4%"

(ping -4 -n 1 %internetAddress% | findstr /i "TTL=")>nul 2>&1

if %errorlevel% NEQ 0 (
    goto :internetfail
) else (
    for /F "tokens=7 delims==< " %%A in ('ping -4 -n 1 %internetAddress% ^| findstr /i "TTL="') do (
        set "ims=%%A"
    )
    goto :internetSuccess
)

:internetSuccess
echo internet = success @ %ims% - %currentTime% %currentDate%
(echo internet, success, %currentTime%, %currentDate%, %ims%)>>%filename%
(ping localhost -n %speed%)>nul 2>&1
goto :routerstart

:internetFail
set "ims=n/a"
echo internet = failure @ %ims% - %currentTime% %currentDate%
(echo internet, failure, %currentTime%, %currentDate%, %ims%)>>%filename%
(ping localhost -n %speed%)>nul 2>&1
goto :routerstart

:routerstart
(ping -4 -n 1 %routerAddress% | findstr /i "TTL=")>nul 2>&1

if %errorlevel% NEQ 0 (
    goto :routerFail
) else (
    for /F "tokens=7 delims==< " %%B in ('ping -4 -n 1 %routerAddress% ^| findstr /i "TTL="') do (
        set "rms=%%B"
    )
    goto :routerSuccess
)

:routerSuccess
echo router   = success @ %rms% - %currentTime% %currentDate%
(echo router, success, %currentTime%, %currentDate%, %rms%)>>%filename%
(ping localhost -n %speed%)>nul 2>&1
goto :internetstart

:routerFail
set "rms=n/a"
echo router   = failure @ %rms% - %currentTime% %currentDate%
(echo router, failure, %currentTime%, %currentDate%, %rms%)>>%filename%
(ping localhost -n %speed%)>nul 2>&1
goto :internetstart

Ваша главная проблема здесь заключается в том, что ваша %errorlevel% обработка переменных была неправильной.При циклическом выполнении команды, если нет вывода , весь цикл for будет пропущен .Таким образом, когда команда завершилась неудачно, цикл for был пропущен (ничего зацикливаться; пустые строки игнорировались).

Исправлены некоторые другие технические детали;просто чтобы избежать неожиданного поведения.

0 голосов
/ 10 февраля 2019

Будьте осторожны с %errorlevel% здесь, так как destination host unreachable вернет errorlevel 0.Вместо этого давайте используем if defined просто потому, что findstr установит ims и rms, только если найдет TTL=.Нам также не нужны все метки, мы можем просто выполнять операторы блока кода if defined, и первый цикл for будет переходить к следующему, кроме последнего goto start, к которому могут идти другие, в конце концов, также нет delayedexpansionнеобходимо:

@echo off
set "internetAddress=8.8.8.8"
set "routerAddress=192.168.1.1"
set speed=2
set filename=C:\PingTest\PingResults\PingTest_%time:~0,2%%time:~3,2%%time:~6,2%_%date:~-10,2%%date:~-7,2%%date:~-4,4%.csv
echo %filename%
echo Type, Status, Time, Date, ms>>%filename%

:start
set ims=
set rms=
set "currentTime=%time:~0,2%:%time:~3,2%:%time:~6,2%"
set "currentDate=%date:~-10,2%/%date:~-7,2%/%date:~-4,4%"

for /F "tokens=7 delims==< " %%G in ('ping -4 -n 1 %internetAddress% ^| findstr /i "TTL="') do set "ims=%%G"
if defined ims ( 
    echo internet = success @ %ims% - %currentTime% %currentDate%
    echo internet, success, %currentTime%, %currentDate%, %ims%>>%filename%
    timeout 2 /nobreak>nul
 ) else (
    echo internet = failure @ N/A - %currentTime% %currentDate%
    echo internet, failure, %currentTime%, %currentDate%, N/A>>%filename%
    timeout 2 /nobreak>nul
)

for /F "tokens=7 delims==< " %%A in ('ping -4 -n 1 %routerAddress%^|findstr /i "TTL="') do set "rms=%%A"
if defined rms (
    echo router = success @ %rms% - %currentTime% %currentDate%
    echo router, success, %currentTime%, %currentDate%, %rms%>>%filename%
    timeout 2 /nobreak>nul
 ) else (
    echo router   = failure @ N/A - %currentTime% %currentDate%
    echo router, failure, %currentTime%, %currentDate%, N/A>>%filename%
    timeout 2 /nobreak>nul
)
goto start
0 голосов
/ 09 февраля 2019

Вы должны использовать delayedexpansion при использовании изменяемой переменной в цикле:

В начале вашего скрипта:

@echo off
setlocal enabledelayedexpansion

Затем:

:routerstart

for /F "tokens=7 delims==< " %%A in ('
ping -4 -n 1 %routerAddress%^|findstr /i "TTL="') do (

set rms=%%A 
if !errorlevel! == 0 ( 
         goto:routerSuccess
) else (
         goto:routerFail )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...