1 (изменено: Александр_foxware, 2016-04-11 13:26:38)

Тема: CMD/BAT: Цикл для ping

Добрый день! У меня давно был написан простой скрипт для проверки доступности хоста с логированием. Хотел добавить в скрипт проверку сразу нескольких хостов, но не получается. Пробовал через команду "start", но не получается отлавливать результат команды "ping".

Текущий скрипт:

@ECHO OFF
COLOR 0A

:: ---------- задаем переменные -------------

:: задаем узел для тестирования доступа
set IP_for_test=8.8.8.8

:: задаем путь к папке с логом
set log_dir=C:\scripts\test_connect

:: задаем количество пакетов для оценки
set num_packets=20

:: задаем таймаут для каждого ответа
set ping_timeout=1000

:: -------------------------------------------


set badaccess=0
set goodaccess=1

:: проверяем наличие папки для лога
if not exist %log_dir% md %log_dir%

:starttesting

ping.exe -l 1 -n %num_packets% -w %ping_timeout% %IP_for_test% | find "TTL=" > nul
if %errorlevel%==1 (
	set badaccess=1
	if %goodaccess%==1 echo %date% lost access to the %IP_for_test% in  %time% >> %log_dir%\%IP_for_test%_log.txt
	set goodaccess=0
) else (
	set goodaccess=1
	if %badaccess%==1 echo %date% will have access to the %IP_for_test% in  %time% >> %log_dir%\%IP_for_test%_log.txt
	if %badaccess%==1 echo. >> %log_dir%\%IP_for_test%_log.txt
	set badaccess=0
)

goto :starttesting

exit /b 0

2

Re: CMD/BAT: Цикл для ping

Александр_foxware пишет:

Текущий скрипт...



Не-а. Так не пойдёт. Нерабочий он.

Вот правильный код:

@echo off
setlocal enabledelayedexpansion


:: ---------- задаем переменные -------------

:: задаем узел для тестирования доступа
set "IP_for_test=8.8.8.8"

:: задаем путь к папке с логом
set "log_dir=C:\scripts\test_connect"

:: задаем количество пакетов для оценки
set "num_packets=20"

:: задаем таймаут для каждого ответа
set "ping_timeout=1000"

:: -------------------------------------------


:: проверяем наличие папки для лога
if not exist "%log_dir%" md "%log_dir%"


:starttesting

	ping.exe -l 1 -n %num_packets% -w %ping_timeout% %IP_for_test% | >nul find "TTL="

	>>"%log_dir%\%IP_for_test%_log.txt" (
		if !errorlevel!==1 (
			echo !date! lost access to the %IP_for_test% in  !time!
		) else (
			echo !date! will have access to the %IP_for_test% in  !time!
			echo.
		)
	)

goto starttesting

.

А вот код, который Вам нужен:

@echo off


:: ---------- задаем переменные -------------

:: задаем узлы для тестирования доступа
set IP_for_test="0.0.0.0" "1.1.1.1" "2.2.2.2" "3.3.3.3" "4.4.4.4" "5.5.5.5" "6.6.6.6" "7.7.7.7" "8.8.8.8" "9.9.9.9"

:: задаем путь к папке с логом
set "log_dir=C:\scripts\test_connect"

:: задаем количество пакетов для оценки
set "num_packets=20"

:: задаем таймаут для каждого ответа
set "ping_timeout=1000"

:: -------------------------------------------


:: проверяем наличие папки для лога
if not exist "%log_dir%" md "%log_dir%"

for %%i in (%IP_for_test%) do start "" /b cmd /v/c for /l %%j in () do @for /f %%k in ('^
 ping -l 1 -n %num_packets% -w %ping_timeout% %%i^^^| find "TTL="^^^| find/c /v ""') do @^
  ^>^>"%log_dir%\%%~i_log.txt" (if %%k gtr 0 (echo !date! will have access to the %%~i in  !time!^&^
   echo.) else echo !date! lost access to the %%~i in  !time!)

.

3

Re: CMD/BAT: Цикл для ping

Большое спасибо! Yury - сложное написание с перенаправлением результатов команд

4

Re: CMD/BAT: Цикл для ping

Пытался понять последний скрипт - разложить "красиво", но он не работает. Что не так?

@echo off


:: ---------- задаем переменные -------------

:: задаем узлы для тестирования доступа
set IP_for_test="0.0.0.0" "1.1.1.1" "2.2.2.2" "3.3.3.3" "4.4.4.4" "5.5.5.5" "6.6.6.6" "7.7.7.7" "8.8.8.8" "9.9.9.9"

:: задаем путь к папке с логом
set "log_dir=C:\scripts\test_connect"

:: задаем количество пакетов для оценки
set "num_packets=20"

:: задаем таймаут для каждого ответа
set "ping_timeout=1000"

:: -------------------------------------------


:: проверяем наличие папки для лога
if not exist "%log_dir%" md "%log_dir%"

for %%i in (%IP_for_test%) do (
	start "" /b cmd /v/c for /l %%j in () do @for /f %%k in ('^ping -l 1 -n %num_packets% -w %ping_timeout% %%i^^^| find "TTL="^^^| find/c /v ""') do @^^>^>"%log_dir%\%%~i_log.txt" (
		if %%k gtr 0 (
			echo !date! will have access to the %%~i in  !time!^&^
			echo.
		) else (
			echo !date! lost access to the %%~i in  !time!
		)
	)
)