PDA

Показать полную графическую версию : [решено] Ping со временем и датой


Страниц : 1 [2]

Foreigner
30-11-2015, 15:35
1. Где находится батник?
2. Что выводит %path% (из консоли):

for %i in ("%path:;=";"%") do @echo %i

3. Есть ли c:\windows\system32\ping.exe?
4. Есть ли другие исполняемые файлы (echo %pathext%) с именем ping.*, которые находятся в любом из каталогов %path%

Iska
30-11-2015, 15:37
The_Immortal, я бы для начала убрал все перенаправления в файл, открыл консоль, запустил пакетный файл и посмотрел на его вывод.

Foreigner
30-11-2015, 15:48
Еще можно поискать 1.txt:

dir /b /s /a C:\1.txt

Это конечно займет некоторое время.

The_Immortal
30-11-2015, 16:22
Господа, я прошу простить меня. В корне диска С лежала скаченная самопальная утилита ping.exe, которая и запускалась при выполнении скрипта... Запускалась она в полном фоне, поэтому я её и не видел :tomato2:

Foreigner, в вышеуказанном скрипте пинг происходит 4 раза (стандартно), после этого результат записывается в файл и скрипт завершается, а нужна бесконечность.
Я попробовал так:
@echo off
setlocal
1>nul chcp 866

for /f "tokens=*" %%i in ('"ping ya.ru -t | findstr "TTL=""') do call:1 %%i
goto:eof

:1
1>nul chcp 1251
1>>C:\1.txt echo %date% %time%: %*
1>nul chcp 866Но так работать не захотело.

Foreigner
30-11-2015, 17:06
Но так работать не захотело. »
Если пинг бесконечный, то лучше сделать много пингов:

@echo off
setlocal
1>nul chcp 866


:1
1>nul timeout /t 1
for /l %%i in (0,1,9) do (

for /f "tokens=*" %%j in ('"ping -n 1 ya.ru | findstr "TTL=""') do (

if %%i geq 9 goto:1
call:2 %%j

))

goto:eof

:2
1>nul chcp 1251
1>>1.txt echo %date% %time%: %*
1>nul chcp 866

timeout -- чтобы не сильно загружать систему
Выйти из батника Ctrl+C

Duber123
23-07-2022, 19:30
Всем привет.
Очень помогло данное решение.
Но, если пинговать IP-адрес или имя компьютера, то файл не создаётся.
Подскажите как решить эту проблему?

UPD: оказывается, если пингуемый хост недоступен, то лог не пишется.
Как можно доработать код, чтобы в файл писалось, что пинг не прошёл?

megaloman
24-07-2022, 17:55
@Echo Off
cls
Set /A TWait=1
Set "Addr=lenta.ru"

Set "Log=Z:\Soft_Out\Ping.log"

:Begin
Set "Str="
FOR /F "usebackq delims=" %%p IN (`ping -n 5 %Addr%`) DO Set "Str=%%p"
>>"%Log%" Echo %Date% %Time% %Addr% %Str%
>nul TimeOut /T %TWait%
GoTo :Begin
Exit /B

Duber123
24-07-2022, 18:56
Это немного не тот формат вывода, который бы хотелось получить + крякозыбры опять.

Вот, сделал под свои нужды:


@echo off
:ping
for /f "tokens=* skip=2" %%a in ('ping ya.ru -n 1 -4') do (
echo %date% %time:~0,8% %%a>>c:\users\%username%\desktop\pingtime.txt
timeout 1 >nul
goto ping)



Но как к этому прикрутить кодировку из примера Foreigner, чтобы в блокноте кириллица отображалась?

megaloman
25-07-2022, 08:23
Duber123, Если применить способ Foreigner к Вашему решению, то@echo off
>nul chcp 866
:Begin
For /f "tokens=* skip=2" %%a in ('ping lenta.ru -n 1') Do Call :Out "%%date%% %%time:~0,8%% %%a"
>nul timeout 3
GoTo :Begin
:Out
>nul Chcp 1251
>>"Z:\Soft_Out\ping1251.log" Echo %~1
>nul chcp 866
Exit /B
Если к моему, то@Echo Off
cls
>nul chcp 866
Set /A TWait=1
Set "Addr=lenta.ru"
Set "Log=Z:\Soft_Out\MyPing1251.log"

:Begin
Set "Str="
FOR /F "usebackq delims=" %%p IN (`ping -n 5 %Addr%`) DO Set "Str=%%p"
Call :Out "%Date% %Time% %Addr% %Str%"
>nul TimeOut /T %TWait%
GoTo :Begin
:Out
>nul Chcp 1251
>>"%Log%" Echo %~1
>nul chcp 866
Exit /B
Это немного не тот формат вывода »По моему скромному мнению Ваш файл трудно читаем, у меня же выдаётся только итоговая строка, что удобнее для просмотра и анализа.
Общая проблема: окно CMD будет висеть черным пятном. Можно, конечно, применить VBS, чтобы его скрыть, а можно полностью переделать в VBSDim Address: Address = "lenta.ru"
Dim LogFile: LogFile = "Z:\Soft_Out\PingVbs.log"
Dim WaitSek: WaitSek = 60

Dim Msg
With CreateObject("Scripting.FileSystemObject").OpenTextFile(LogFile, 8, True)
Do
With GetObject("winmgmts:").Get("Win32_PingStatus.Address='" + Address + "'")
Msg = CStr(Now) + " " + .Address + " " + .ProtocolAddress + " "
If IsNull(.ResponseTime) Then
Msg = Msg + " ResponseTime= нет ответа" + " "
Else
Msg = Msg + "ResponseTime=" + CStr(.ResponseTime) + " "
Msg = Msg + "TTL= " + CStr(.ResponseTimeToLive)
End If
End With
.WriteLine Msg
'MsgBox Msg
WScript.Sleep (WaitSek * 1000)
Loop
End WithУбить скрипт можно из диспетчера задач (процесс WScript.exe)

Duber123
25-07-2022, 10:02
По моему скромному мнению Ваш файл трудно читаем.

Да, согласен, но так стало после добавления вашего кода.

Изначально же мой файл содержит классический вывод команды Ping + метка времени (открыт с помощью NotePad++):


25.07.2022 9:43:39 Ответ от 87.250.250.242: число байт=32 время=6мс TTL=248
25.07.2022 9:43:40 Ответ от 87.250.250.242: число байт=32 время=6мс TTL=248
25.07.2022 9:43:41 Ответ от 87.250.250.242: число байт=32 время=6мс TTL=248
25.07.2022 9:43:42 Ответ от 87.250.250.242: число байт=32 время=6мс TTL=248
25.07.2022 9:43:43 Ответ от 87.250.250.242: число байт=32 время=6мс TTL=248


Т.к. нужно решение именно на BAT-файле, возможно привести выводимую информацию именно к такому виду?

С окном консоли действительно есть такой эффект, но для меня не критично, т.к. пинговать приходиться редко и только когда нужно выявить время аварийного отключения хоста.
Я просто его сворачиваю и таким образом иконка на панели задач служит напоминанием, что процесс запущен.

DJ Mogarych
25-07-2022, 13:18
нужно решение именно на BAT-файле »
Почему не перейти на Powershell? Мало того, что не надо извращаться и спотыкаться о древние проблемы, так можно вообще пинговать по условию, чтобы скрипт сам считал время недоступности сервера или ещё как угодно.

Duber123
25-07-2022, 14:34
Можно и так конечно реализовать, и скриптами, или использовать специальные утилиты и прочие готовые решения.
Но пакетным файлом как-то сподручнее пользоваться. Задача-то тривиальная.
С кодировкой в моём случае тоже не особо принципиально, т.к. решаемо сторонним просмотрщиком, да и там переводить по большому счёту нечего.
Либо узел доступен, либо нет, по крякозябрам можно понять, а время итак отображается корректно.
В общем, пока обхожусь имеющимся вариантом.

megaloman
25-07-2022, 15:11
Duber123, Если Вам мило своё решение и крокозябры не пугают - учите лучше английский. :)
Вот Ваш подправленный вариант - у Вас при потере связи батник завершался@echo off
>nul Chcp 437
:Begin
for /f "tokens=* skip=2" %%a in ('ping lenta.ru -n 1 -4') do (
echo %date% %time:~0,8% %%a>>"Z:\Soft_Out\pingtime.txt"
timeout 1 >nul
goto :Begin
)
>nul timeout 1
goto :BeginИли то же, но всё-таки с кириллицей@echo off
>nul Chcp 866
:Begin
for /f "tokens=* skip=2" %%a in ('ping lenta.ru -n 1 -4') do (
Call :Out "%%date%% %%time:~0,8%% %%a"
timeout 1 >nul
goto :Begin
)
>nul timeout 1
goto :Begin

:Out
>nul Chcp 1251
>>"Z:\Soft_Out\pingtime.txt" Echo %~1
rem Echo %~1
>nul chcp 866
Exit /B

Duber123
26-07-2022, 13:02
megaloman
Вот чего-чего, а английский знаю на таком уровне, который мне позволяет понимать технический текст.
И уже ранее удалось вывести результат на английском, но на русском как-то привычнее.
Вот лучше бы я учил консольные команды, больше пользы было бы)

Итак, к нашему вопросу:
Проверил, мой батник действительно завершает работу, но только если обрыв связи происходил на моей стороне, что не так важно, т.к. главное - это коннект удалённого узла.
Но всё равно благодарю за корректировку, возьму на вооружение.

А вот за вариант с кириллицей очень спасибо, прям то, что нужно и оно работает)
И ещё такой вопрос: можно ли именно с помощью доп. команд сделать так, чтобы батник принудительно отрабатывался с повышенными правами?
Потому что на некоторых машинах приходится запускать от имени администратора, иначе просто открывается чёрный экран консоли и лог-файл не пишется.
Хотя, если запустить его через командную строку (даже не под админом) тогда он тоже срабатывает.

UPD: Рано радовался, на одноранговой сети (в рабочей группе) работает без нареканий, а вот при пинге доменных хостов по IP-адресу или по имени компьютера батник выводит в консоль повторяющуюся ошибку, мол не удаётся найти указанный файл, но продолжает (хоть и частично) сохранять записи в файл. При этом файл с англоязычной кодировкой отрабатывает корректно. Как можно побороть данную проблему?




© OSzone.net 2001-2012