Компьютерный форум 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=298687)

The_Immortal 20-04-2015 22:03 2498454

Ping со временем и датой
 
Друзья, подскажите, пожалуйста, готовый скрипт, который бы выводил результаты пинга с датой и временем?

В инете есть варианты, но что-то на нужное не наткнулся...


Спасибо!

Iska 21-04-2015 00:16 2498488

Цитата:

Цитата The_Immortal
с датой и временем? »

Это как?

Цитата:

Цитата The_Immortal
результаты пинга »

Какие именно результаты?

The_Immortal 21-04-2015 01:02 2498501

Iska, пример (что должно быть на выходе):
Код:

>ping oszone.net

Обмен пакетами с oszone.net [89.108.118.149] с 32 байтами данных:
21.04.2015 01:02:45 Ответ от 89.108.118.149: число байт=32 время=33мс TTL=56
21.04.2015 01:02:45 Ответ от 89.108.118.149: число байт=32 время=28мс TTL=56
21.04.2015 01:02:46 Ответ от 89.108.118.149: число байт=32 время=28мс TTL=56
21.04.2015 01:02:46 Ответ от 89.108.118.149: число байт=32 время=30мс TTL=56
...


Georgio 21-04-2015 01:46 2498511

http://forum.oszone.net/post-2492125-7.html

The_Immortal 21-04-2015 01:55 2498518

Georgio, хм... после принудительного прерывания скрипта в результирующий файл попадает лишь одна строка:
Цитата:

Завершить выполнение пакетного файла [Y(да)/N(нет)]?

Georgio 21-04-2015 02:30 2498522

The_Immortal, я знал, что такая строка может (но крайне редко) попадать в конец вывода, но вот чтобы только одна, представить трудно.


Попробуйте тогда так (запускать от имени администратора не нужно; кодировка "OEM-866"):

Код:

@cd/d "%~dp0"& for /l %%i in () do @>nul chcp 866& ping -n 1 google.ru| findstr/i "Превышен Ответ"|(
for /f "delims=" %%j in ('more') do @>nul chcp 1251& >>"ping.txt" cmd/v/c "echo.!time:~0^,8! %%j")

.

The_Immortal 21-04-2015 02:35 2498523

Georgio,
Цитата:

Цитата Georgio
Попробуйте тогда так »

а так почему-то ожидаемый ping.txt не создается...

Georgio 21-04-2015 02:48 2498526

The_Immortal, "ping.txt" создаётся в той же директории, где сам пакетный файл и находится. Вы точно сохраняете пакетный файл в кодировке "OEM-866"?

The_Immortal 21-04-2015 09:47 2498586

Georgio,
Цитата:

Цитата Georgio
Вы точно сохраняете пакетный файл в кодировке "OEM-866"? »

Нет, не точно. Был невнимателен, извиняюсь!
Работает, спасибо!

The_Immortal 21-04-2015 19:06 2498832

Georgio, а можно обнаглеть и попросить Вас спереди добавить дату в формате ДД.ММ.ГГГГ, чтобы было как вот в этом примере? :unsure:

Georgio 21-04-2015 19:16 2498836

The_Immortal, держите:

Код:

@cd/d "%~dp0"& for /l %%i in () do @>nul chcp 866& ping -n 1 google.ru| findstr/i "ЏаҐўлиҐ* ЋвўҐв"|(
for /f "delims=" %%j in ('more') do @>nul chcp 1251& >>"ping.txt" cmd/v/c "echo !date! !time:~0^,8! %%j")

.

The_Immortal 30-11-2015 10:10 2579997

Друзья, подскажите, пожалуйста, актуальный скрипт по Windows 8.1. Этот в файл ничего не пишет.


Спасибо!

Foreigner 30-11-2015 13:08 2580033

The_Immortal,
Код:

@echo off
setlocal
1>nul chcp 866

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

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


The_Immortal 30-11-2015 13:44 2580037

Foreigner, благодарю, но так даже файл "1.txt" почему-то не создается. А если создать его вручную, то туда ничего не записывается, хотя соединение с инетом есть.

Foreigner 30-11-2015 14:32 2580056

Цитата:

Цитата The_Immortal
но так даже файл "1.txt" почему-то не создается.

А как вы запускаете батник? Ну пропишите полный путь до 1.txt, хотя я подозреваю, что он лежит в вашем %userprofile% (C:\Users\ваш_аккаунт\1.txt)
И как называется ваш батник? Надеюсь, не ping.cmd(bat)

The_Immortal 30-11-2015 14:43 2580060

Foreigner,
Цитата:

Цитата Foreigner
А как вы запускаете батник? »

Эм... Обычным образом :) Пробовал и от администратора.
Цитата:

Цитата Foreigner
как называется ваш батник?»

pinger.bat
Цитата:

Цитата Foreigner
Ну пропишите полный путь до 1.txt »

Прописал:
Код:

@echo off
setlocal
1>nul chcp 866

for /f "tokens=*" %%i in ('"ping ya.ru | 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 15:06 2580072

Цитата:

Цитата The_Immortal
Не фурычит »

Даже не знаю, что посоветовать. Если вы прописали C:\1.txt, то надо запускать от администратора. В домашнем каталоге смотрели?

The_Immortal 30-11-2015 15:08 2580074

Foreigner,
Цитата:

Цитата Foreigner
В домашнем каталоге смотрели? »

Смотрел - и там пусто.

Foreigner 30-11-2015 15:13 2580075

А так? Если и так не будет работать, то у вас какие-то проблемы с настройками.
Код:

@echo off
setlocal
1>nul chcp 866

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

:1
1>nul chcp 1251
1>>"%~dp01.txt" echo %date% %time%: %*
1>nul chcp 866


The_Immortal 30-11-2015 15:17 2580078

Foreigner, и так не работает. А какие могут быть проблемы с настройками?

Foreigner 30-11-2015 15:35 2580084

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 2580085

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

Foreigner 30-11-2015 15:48 2580090

Еще можно поискать 1.txt:
Код:

dir /b /s /a C:\1.txt
Это конечно займет некоторое время.

The_Immortal 30-11-2015 16:22 2580102

Господа, я прошу простить меня. В корне диска С лежала скаченная самопальная утилита 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 2580109

Цитата:

Цитата The_Immortal
Но так работать не захотело. »

Если пинг бесконечный, то лучше сделать много пингов:
Код:

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

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

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

megaloman 24-07-2022 17:55 2989118

Код:

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

Это немного не тот формат вывода, который бы хотелось получить + крякозыбры опять.

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

Код:

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

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

Цитата:

Цитата Duber123
Это немного не тот формат вывода »

По моему скромному мнению Ваш файл трудно читаем, у меня же выдаётся только итоговая строка, что удобнее для просмотра и анализа.
Общая проблема: окно CMD будет висеть черным пятном. Можно, конечно, применить VBS, чтобы его скрыть, а можно полностью переделать в VBS
Код:

Dim 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 2989165

Цитата:

По моему скромному мнению Ваш файл трудно читаем.
Да, согласен, но так стало после добавления вашего кода.

Изначально же мой файл содержит классический вывод команды 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 2989175

Цитата:

Цитата Duber123
нужно решение именно на BAT-файле »

Почему не перейти на Powershell? Мало того, что не надо извращаться и спотыкаться о древние проблемы, так можно вообще пинговать по условию, чтобы скрипт сам считал время недоступности сервера или ещё как угодно.

Duber123 25-07-2022 14:34 2989180

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

megaloman 25-07-2022 15:11 2989184

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 2989239

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

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

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

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


Время: 22:58.

Время: 22:58.
© OSzone.net 2001-