Войти

Показать полную графическую версию : ping-скрипт


jah
22-03-2014, 02:09
Здравствуйте!

Как можно грамотно реализовать данный скрипт (сам подход и вывод (возможно несколькими вариантами))?

Сам скрипт (лучше пока не получилось):

::chcp 65001
::chcp 65001>nul

@echo off
set ip=192.168.1.1
ping %ip% -n 1 | 1>nul find "TTL=" && (echo. & echo %ip% & echo - ok & echo.) || (echo. & echo %ip% - problem & echo.)

set ip=192.168.1.2
ping %ip% -n 1 | 1>nul find "TTL=" && (echo. & echo %ip% & echo - ok & echo.) || (echo. & echo %ip% - problem & echo.)

@pause


вывод:


192.168.1.1
- ok


192.168.1.2 - problem

Press any key to continue . . .


а надо:


192.168.1.1 - ok


192.168.1.2 - problem

Press any key to continue . . .


и чтобы раскомментирование строчки с chcp не вызывало некорректной работы скрипта


Также хотелось бы скриптом оценить не две, а три ситуации:
- хост успешно отвечает,
- превышен интервал ожидания для запроса,
- хост не найден

По локали ответ разный, хотелось бы ориентироваться на нечто типа %errorlevel%, но при превышении интервала ожидани она возвращает 0, то есть как и при успешном пинге.

PS: попутно узнал, что называть командный файл типа ping.bat не стоило


Спасибо!

Georgio
22-03-2014, 14:49
С учётом всех Ваших пожеланий:

@echo off
chcp 65001>nul

for %%i in (192.168.1.1 192.168.1.2) do (
set ip=%%i
call:#
)
echo.
echo.
pause
exit /b

:#
(
for /f "skip=2 delims=" %%i in ('ping %ip% -n 1') do (
echo %%i| >nul findstr "TTL="&& (
echo.& echo %ip% - ok& echo.
exit /b
)|| (
echo.& echo %ip% - request timed out& echo.
exit /b
)
)
)|| (
echo.& echo %ip% - host not found& echo.
)
exit /b

.


Примечание: команда "find" не работает с кодовой страницей "65001", а команда "findstr" работает.

jah
22-03-2014, 18:51
С учётом всех Ваших пожеланий:
Код:
@echo off
chcp 65001>nul
for %%i in (192.168.1.1 192.168.1.2) do (
set ip=%%i
call:#
)
echo.
echo.
pause
exit /b
:#
(
for /f "skip=2 delims=" %%i in ('ping %ip% -n 1') do (
echo %%i| >nul findstr "TTL="&& (
echo.& echo %ip% - ok& echo.
exit /b
)|| (
echo.& echo %ip% - request timed out& echo.
exit /b
)
)
)|| (
echo.& echo %ip% - host not found& echo.
)
exit /b »

спасибо, добрый человек, буду разбираться с тонкостями, цикл for здесь точно в тему

если на на первый взгляд, то пока не понял в чём идея определения превышения времени интервала ожидания (к тому же в приведённой реализации не работает: на каждый из приведённых узлов выводит request timed out, хотя один доступен, а второго не существует), но тут сначала надо осмыслить детали приведённого


Примечание: команда "find" не работает с кодовой страницей "65001", а команда "findstr" работает. »
теперь понятно, в чём была проблема


также остался непонятным момент с переносом ok в выводе моего скрипта, или следует воспринять это как недоработку особенность интерпретатора

jah
26-03-2014, 00:36
Georgio, можете пояснить свой код (зачем там skip=2 и delim без значения, расстановку скобку для решения данной задачи и почему код не отрабатывает как должен)?

я, в свою очередь, дошёл до такого, хотя оно также не отрабатывает как предполагалось, очевидно, где-то пробелы в логике, хотя с виду вроде бы всё чётко


setlocal enableDelayedExpansion
@echo off
chcp 65001 >nul

for %%i in (
192.168.1.1
192.168.1.2
) do (
echo.
set "ip=%%i"
call :#
echo.
)
endlocal
pause
exit /b

:#
for /f "tokens=*" %%i in ('ping !ip! -n 1') do (
if errorlevel 1 (
echo !ip! - host not found
exit /b
)
echo %%i |>nul findstr "TTL=" && (
echo !ip! - host found
exit /b
) || (
echo !ip! - request timed out
exit /b
)
)

jah
26-03-2014, 23:16
может кто подтолкнёт или без вариантов :)

пока рабочий вариант с двумя вариантами

@echo off
chcp 65001 >nul

for %%i in (
ya.ru
ya.con
google.com
192.168.1.1
192.168.1.2
) do (
echo.
ping %%i -n 1 |>nul findstr "TTL=" && (
echo %%i - ok
) || (
echo %%i - problem
)
echo.
)
echo.
echo.
echo.
cmd /k




Также может быть кто-нибудь знает:

1. как можно организовать логику типа

ping %%i -n 1 |>nul findstr "TTL=" || (
команда в случае неудачного выполнения, эта часть работает
) || (
команда в противном случае, эта часть очевидно не работает
)

это логика типа if not - else, возможно и нужно использовать if, но как сформировать условие из ping пока не понятно


2. как можно оставить комментарий и использовать метки (если это возможно) в подобных местах (может экранировать как-то нужно или как-то по-другому)

ping %%i -n 1 |>nul findstr "TTL=" && (
::комментарии и метки в этом блоке не работают

goto :#
:#
echo something
)

jah
27-03-2014, 23:28
может кто подтолкнёт или без вариантов »
http://www.cyberforum.ru/cmd-bat/thread877664.html
автору спасибо за то, до чего дойти по справке проблематично

попробую ответить на ряд своих вопросов:

зачем там skip=2 »
возможно неверное предположение:
строим логику таким образом, чтобы внутри цикла for были "успешные" команды (хост доступен, превышено время ожидания), оставшийся вариант будем расценивать как "хост недоступен"
если хост недоступен, то ping возвращает ошибку, в приведённом варианте это не используется, используется возвращение ошибки самим циклом, для этого добавляется skip=2, в выводе на "хост не доступен" всего две строки, которые пропускаются, в результате в %%i нечего помещать и echo %%i приводит к ошибке, в результате которой работа цикла аварийно завершается, поэтому подхватывается код после || для самого цикла (а не внутри него)
таким образом, код для host not found отрабатывает как надо

зачем там ... delim без значения »
"delims=" это эквивалент tokens=* (подойдёт любой вариант), чтобы строки вывода по очереди помещались в %%i целиком (без разбивки на токены)


for /f "tokens=*" %%i in ('ping !ip! -n 1') do (
if errorlevel 1 (
echo !ip! - host not found
exit /b »
хотя оно также не отрабатывает как предполагалось »
неуспешность пинга как набора в цикле for не влияет на успешность предыдущей операции и соответственно на значение errorlevel, неуспешной операции до этого не было, поэтому %errorlevel% == 0 и команды в первом if пропускаются

как можно оставить комментарий в подобных местах »
rem, не

PS: с остальными пока туго, буду разговаривать здесь с собой, пока не просветлею или не опустятся руки :)




© OSzone.net 2001-2012