[CMD] Помощь в написании cmd-файла для проверки пинга на сайты

orderman

Опытный участник
Сообщения
960
Реакции
863
Здравствуйте.
Нужна Ваша помощь. Необходимо написать пакетный файл, который:
- от имени текущего пользователя запускал команды:
1)
CMD/BATCH:
ping -n 100 8.8.8.8
2)
CMD/BATCH:
ping -n 100 speedtest.net
3)
CMD/BATCH:
ping -n 100 speedtest.ukrtelecom.ua
- результат каждой команды выводился в соответствующий текстовый файл (расположение Рабочий Стол);
- командный файл необходимо выполнить несколько раз (3-5) через определенный период времени 30 мин - 1 час;
- проверяется условие наличия текстового файла (при отсутствии - файл создается, если есть результат дописывается в конец файла) - необязательно.

Желательно;
- чтобы перед результатом вывода команды в файл добавлялись текущие дата и время;
- команды выполнялись одновременно;
- окно выполнения команд желательно спрятать, чтобы не мешать пользователю;
- по окончанию выполнения вывести окно с сообщением об окончании работы.
ОС будет Win7-10.
Спасибо!
 
- по окончанию выполнения вывести окно с сообщением об окончании работы.
Через каждый час выводить на экран окно? Не надоест?
- по окончанию выполнения вывести окно с сообщением об окончании работы.
по окончанию чего - всего задания или каждого из трёх?
Или когда все 5 раз отработает?
Примерно так:

качаете NirCmd by Nir Sofer.

Ложите рядом с батником NirCmd.exe. Батник такой:

CMD/BATCH:
@echo off

:: интервал повтора в минутах
set interval=30

:: кол-во повторов
set times=5

:: кол-во отправляемых пакетов
set pockets=100

:: расположение логов
set "p1_log=%UserProfile%\Desktop\ping_8888.log"
set "p2_log=%UserProfile%\Desktop\ping_speedtest.log"
set "p3_log=%UserProfile%\Desktop\ping_speedtest_ukr.log"

set /a interval*=60

:begin

set /a ctimes+=1
set t=%date% - %time%

>> "%p1_log%" echo.
>> "%p2_log%" echo.
>> "%p3_log%" echo.
>> "%p1_log%" echo %t%
>> "%p2_log%" echo %t%
>> "%p3_log%" echo %t%

nircmd exec hide cmd.exe /c ">> "%p1_log%" ping -n %pockets% 8.8.8.8"
nircmd exec hide cmd.exe /c ">> "%p2_log%" ping -n %pockets% speedtest.net"
nircmd exec hide cmd.exe /c ">> "%p3_log%" ping -n %pockets% speedtest.ukrtelecom.ua"

if %ctimes%==%times% exit /b
timeout /T %interval%
goto begin

Создаёте ярлык к NirCmd.exe, заходите в свойства ярлыка, в поле объект дописываете:
Код:
exec hide trace.cmd

trace.cmd - имя батника.

tr.png


Заходите в свойства NirCmd.exe, жмёте "Разблокировать".
Запускаете задание с ярлыка.

Чтобы досрочно убить задание:
CMD/BATCH:
taskkill /im ping.exe
taskkill /im cmd.exe
 
Последнее редактирование:
по окончанию чего - всего задания или каждого из трёх?
Или когда все 5 раз отработает?
Спасибо.
Сообщение должно появиться 1 раз после выполнения полностью всего задания.
 
С этим сложнее.
Необходимо запустить ещё 4-ый процесс, который будет следить за PID-ами.
Итого:

Основной батник:
CMD/BATCH:
@echo off
SetLocal EnableExtensions

:: интервал повтора в минутах
set interval=1

:: кол-во повторов
set times=5

:: кол-во отправляемых пакетов
set pockets=100

:: расположение логов
set "p1_log=%UserProfile%\Desktop\ping_8888.log"
set "p2_log=%UserProfile%\Desktop\ping_speedtest.log"
set "p3_log=%UserProfile%\Desktop\ping_speedtest_urk.log"

set /a interval*=60

:begin

set /a ctimes+=1
set t=%date% - %time%

>> "%p1_log%" echo.
>> "%p2_log%" echo.
>> "%p3_log%" echo.
>> "%p1_log%" echo %t%
>> "%p2_log%" echo %t%
>> "%p3_log%" echo %t%

:: создание 1-го снимка запущенных процессов ping.exe
set "lst="
set "lst2="
for /f "tokens=2 delims=," %%a in ('tasklist /fo csv /nh /fi "IMAGENAME eq ping.exe" ^| find /i "ping.exe"') do call :addPID "%%~a"

nircmd exec hide cmd.exe /c ">> "%p1_log%" ping -n %pockets% 8.8.8.8"
nircmd exec hide cmd.exe /c ">> "%p2_log%" ping -n %pockets% speedtest.net"
nircmd exec hide cmd.exe /c ">> "%p3_log%" ping -n %pockets% speedtest.ukrtelecom.ua"

timeout /T 3 >NUL

:: создание 2-го снимка запущенных процессов ping.exe и сравнение с первым, разницу сохранить в lst2
for /f "tokens=2 delims=," %%a in ('tasklist /fo csv /nh /fi "IMAGENAME eq ping.exe" ^| find /i "ping.exe"') do (
  set "found="
  for %%b in (%lst%) do if "%%~a"=="%%b" set found=true
  if not defined found call :addPID2 "%%~a"
)

::запуск отслеживания завершения всех процессов из списка lst2
nircmd exec hide cmd.exe /c Awaiting.cmd %lst2%

if %ctimes%==%times% exit /b
timeout /T %interval%
goto begin

:addPID
  set lst=%lst% %~1
exit /b
:addPID2
  set lst2=%lst2% %~1
exit /b
Вспомогательный Awaiting.cmd
CMD/BATCH:
@echo off
SetLocal EnableExtensions

:begin
set "found="
for /f "tokens=2 delims=," %%a in ('tasklist /fo csv /nh /fi "IMAGENAME eq ping.exe" ^| find /i "ping.exe"') do (
  for %%b in (%*) do if "%%~a"=="%%b" set found=true
)
if not defined found (
  nircmd infobox "Пинг завершён." "trace"
  exit /b
)
timeout /T 3 >NUL
goto begin
 

Вложения

  • trace.zip
    83.6 KB · Просмотры: 5
Dragokas, немного не то. Я, наверное, не совсем правильно объяснил. Сообщение должно быть только одно, после выполнения всех повторов, т.е. после завершения последнего цикла.
 
Ну тогда в первом варианте батника замените
CMD/BATCH:
if %ctimes%==%times% exit /b
на
CMD/BATCH:
if %ctimes%==%times% (nircmd infobox "Пинг завершён." "trace" & exit /b)
 
Последнее редактирование:
Назад
Сверху Снизу