Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   ping-скрипт (http://forum.oszone.net/showthread.php?t=279625)

jah 22-03-2014 02:09 2326933

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 не стоило


Спасибо!

Georgio 22-03-2014 14:49 2327063

С учётом всех Ваших пожеланий:

Код:

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

Цитата:

Цитата Georgio
С учётом всех Ваших пожеланий:
Код:
@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, хотя один доступен, а второго не существует), но тут сначала надо осмыслить детали приведённого


Цитата:

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

теперь понятно, в чём была проблема


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

jah 26-03-2014 00:36 2328602

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 2329101

может кто подтолкнёт или без вариантов :)

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

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

Цитата:

Цитата jah
может кто подтолкнёт или без вариантов »

http://www.cyberforum.ru/cmd-bat/thread877664.html
автору спасибо за то, до чего дойти по справке проблематично

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

Цитата:

Цитата jah
зачем там skip=2 »

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

Цитата:

Цитата jah
зачем там ... delim без значения »

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


Цитата:

Цитата jah
for /f "tokens=*" %%i in ('ping !ip! -n 1') do (
if errorlevel 1 (
echo !ip! - host not found
exit /b »

Цитата:

Цитата jah
хотя оно также не отрабатывает как предполагалось »

неуспешность пинга как набора в цикле for не влияет на успешность предыдущей операции и соответственно на значение errorlevel, неуспешной операции до этого не было, поэтому %errorlevel% == 0 и команды в первом if пропускаются

Цитата:

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

rem, не

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


Время: 12:24.

Время: 12:24.
© OSzone.net 2001-