Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - ping-скрипт

Ответить
Настройки темы
CMD/BAT - ping-скрипт
jah jah вне форума

Старожил


Сообщения: 215
Благодарности: 7

Профиль | Отправить PM | Цитировать


Здравствуйте!

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

Сам скрипт (лучше пока не получилось):
Код: Выделить весь код
::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 не стоило


Спасибо!

Отправлено: 02:09, 22-03-2014

 

Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


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

Код: Выделить весь код
@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" работает.

Последний раз редактировалось Georgio, 22-03-2014 в 15:00.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:49, 22-03-2014 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

jah jah вне форума Автор темы

Старожил


Сообщения: 215
Благодарности: 7

Профиль | Отправить PM | Цитировать


Цитата 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 в выводе моего скрипта, или следует воспринять это как недоработку особенность интерпретатора

Отправлено: 18:51, 22-03-2014 | #3

jah jah вне форума Автор темы

Старожил


Сообщения: 215
Благодарности: 7

Профиль | Отправить PM | Цитировать


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
		)
	)

Отправлено: 00:36, 26-03-2014 | #4

jah jah вне форума Автор темы

Старожил


Сообщения: 215
Благодарности: 7

Профиль | Отправить PM | Цитировать


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

пока рабочий вариант с двумя вариантами
Код: Выделить весь код
@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
	)

Отправлено: 23:16, 26-03-2014 | #5

jah jah вне форума Автор темы

Старожил


Сообщения: 215
Благодарности: 7

Профиль | Отправить PM | Цитировать


Цитата 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: с остальными пока туго, буду разговаривать здесь с собой, пока не просветлею или не опустятся руки

Отправлено: 23:28, 27-03-2014 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - ping-скрипт

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - [решено] Дописать скрипт для процедуры ping и записи в log.txt zavoruev Скриптовые языки администрирования Windows 14 18-10-2012 17:18
Любой язык - Как сделать что-бы скрипт игнорировал не нужные ответы Ping root221 Скриптовые языки администрирования Windows 13 02-09-2012 22:28
VBS/WSH/JS - [решено] скрипт проверяет файл по дате после запускает другой скрипт dot85 Скриптовые языки администрирования Windows 9 01-08-2011 14:22
Ping Man itu Сетевые технологии 8 03-07-2004 23:59
Ping Guest Хочу все знать 12 22-01-2003 04:16




 
Переход