Показать полную графическую версию : ping-скрипт
Здравствуйте!
Как можно грамотно реализовать данный скрипт (сам подход и вывод (возможно несколькими вариантами))?
Сам скрипт (лучше пока не получилось):
::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 не стоило
Спасибо!
С учётом всех Ваших пожеланий:
@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" работает.
С учётом всех Ваших пожеланий:
Код:
@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 в выводе моего скрипта, или следует воспринять это как недоработку особенность интерпретатора
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
)
)
может кто подтолкнёт или без вариантов :)
пока рабочий вариант с двумя вариантами
@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
)
может кто подтолкнёт или без вариантов »
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.