Извлечение данных из одного текстового файла в другой с помощью командного файла - PullRequest
0 голосов
/ 27 мая 2019

Недавно у меня были проблемы с подключением к интернету.Чтобы найти проблему в цепочке, я посмотрел код, который нашел в Интернете.Я никогда раньше не писал код для пакетного файла, так что просто продолжайте и ожидайте, что я узнаю что-нибудь.Во всяком случае, я немного поигрался с этим и выяснил, что делает каждая из линий ... по крайней мере, до некоторой степени.Теперь результаты, которые я получаю из этого файла, также включены ниже.Что я хочу сделать, это написать отдельный файл, который я могу запустить, который берет результаты из первого файла и фильтрует их в новый текстовый файл.

Я уже просмотрел некоторые примеры, которые нашел здесь, но я не хочу просто копировать вставку (не то, чтобы такое решение работало ... Я пытался, чтобы я мог перепроектироватьэто, но безрезультатно).Я нашел несколько примеров того, как получить данные из файла, используя FOR и FOREACH-Object, но это мало что значит для меня, и я не могу заставить его работать.

Короче, я быкак данные проверки связи, которые помещаются в первый текстовый файл, который будет отфильтрован пакетным файлом, поэтому он отправляет только часть текста в новый текстовый файл.Возможно ли что-нибудь подобное, и если да, то как мне это сделать?Некоторое объяснение того, как это работает, было бы здорово, так как мне нравится разбирать код на части и играть с ним.

Код, который я использую для получения данных проверки связи при обнаружении ошибки соединения, приведен ниже.Я не говорю, что это работает отлично, главным образом потому, что я не на 100% знаю, как работает% SystemRoot% -part ... Но пока каждый раз, когда он срабатывает, он также находит тайм-аут запроса.Я открыт для предложений по улучшению этого, но я бы хотел сосредоточиться на отмеченной проблеме извлечения из одного файла и отправки его в другой.

:Loop
::Starting up the loop

PING -n 5 127.0.0.1 > NUL
::Set the ping delay

set Address=google.com
::Set the address to ping to google.com

%SystemRoot%\system32\ping.exe -n 1 %Address%|%SystemRoot%\system32\find.exe "TTL=" > NUL
::Check the connection

if %ERRORLEVEL% EQU 0 goto Loop
::If no error, return to Loop
::So if error, continue to next statement

echo Pinging %Address% >> D:\pingtest\Test\logfiletest.log
::Echo the pinging action

echo Trace route %Address% at %date% %time% >> 
D:\pingtest\Test\logfiletest.log
::Echo the route to trace and the timestamp

tracert %Address% >> D:\pingtest\Test\logfiletest.log
::Echo the pinging and results

echo. >> D:\pingtest\Test\logfiletest.log
::Nextline

goto Loop
::Return to Loop 

Вот результаты, которые я получаючто я пытаюсь отфильтровать новый файл.

Pinging google.com 
Trace route google.com at Fri 05/24/2019 10:22:40.92 
Tracing route to google.com [172.217.168.238]

over a maximum of 30 hops:
1    <1 ms    <1 ms    <1 ms  MyLocation 
2    13 ms    12 ms    13 ms  195.190.228.150 
3     *        *        *     Request timed out.
4     7 ms    10 ms     8 ms  139.156.127.75 
5     7 ms     8 ms     9 ms  108.170.241.193 
6    15 ms    18 ms    17 ms  72.14.238.245 
7     8 ms     7 ms     7 ms  ams16s31-in-f14.1e100.net [172.217.19.206]

Trace complete.

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

Trace route google.com at Fri 05/24/2019 10:22:40.92 
3     *        *        *     Request timed out.
5     7 ms     8 ms     9 ms  108.170.241.193 

. В качестве примеров я беру строки 3 и 5, потому что они часто возвращают 'Время ожидания запроса'

Ответы [ 2 ]

1 голос
/ 28 мая 2019

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

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

for /f "tokens=1,*" %%i in (logfile.log) do (
    if "%%i"=="Trace" echo %%i %%j >> shortlog.log
    if "%%i"=="3" echo %%i %%j >> shortlog.log
    if "%%i"=="5" echo %%i %%j >> shortlog.log
)

Это выводит

Trace route google.com at Fri 05/24/2019 10:22:40.92 
3     *        *        *     Request timed out.
5     7 ms     8 ms     9 ms  108.170.241.193 
Trace complete.

Если вы хотите удалить последнюю строку, вы можете изменить свой исходный кодс
echo Trace route %Address% at %date% %time% >> D:\pingtest\Test\logfiletest.log
на
echo #Trace route %Address% at %date% %time% >> D:\pingtest\Test\logfiletest.log

и измените мой код на
if "%%i"=="#Trace" echo %%i %%j >> shortlog.log

0 голосов
/ 27 мая 2019

Труба tracert до find.

Изменить эту строку

tracert %Address% >> D:\pingtest\Test\logfiletest.log

до

tracert %Address% | find "Request timed out." >> D:\pingtest\Test\logfiletest.log

find ищет строки, содержащие Request timed out., и выводит эти строки.

Просмотр find /? для справки.

Если вы хотите понять другие команды, view command /? где команда представляет команда, с которой вам нужна помощь.

Также посмотреть Использование операторов перенаправления команд

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...