使用批处理文件将数据从一个文本文件提取到另一个文本文件

时间:2019-05-26 22:30:02

标签: batch-file

最近,我的互联网连接出现了问题。为了找到链中的问题,我研究了一些在网上找到的代码。我以前从未编写过用于批处理文件的代码,所以就继续吧,并期望我能学到任何东西。无论如何,我玩了一下,发现每一行的作用..至少延伸了一下。现在,我从该文件中获得的结果也包括在下面。我想做的是编写一个单独的文件,我可以运行该文件,从第一个文件获取结果并将其过滤到新的文本文件中。

我已经仔细研究了在这里找到的一些示例,但是我并不想简单地复制粘贴(不是这样的解决方案可以工作……我尝试过可以对它进行反向工程,但是无济于事)。我找到了一些有关如何使用FOR和FOREACH-Object从文件中获取数据的示例,但这对我来说意义不大,我无法使其正常工作。

简而言之,我希望通过批处理文件过滤放置在第一个文本文件中的ping数据,以便它仅将部分文本发送到新的文本文件。这样的事情有可能发生吗,如果可以,我该怎么做?我喜欢将代码拆开并尝试使用它,因此对它的工作原理进行一些解释非常有用。

下面列出了每当检测到连接故障时用于获取ping数据的代码。我并不是说它能完美运行主要是因为我对%SystemRoot%部分的工作方式不是100%的……但是到目前为止,每次触发它还会发现请求超时。我愿意提出改进建议,但我希望重点放在从一个文件提取并将其发送到另一个文件这一著名挑战上。

RuntimeRep

这些是我想要过滤到新文件中的结果。

undefined

所以这是我目前在查看针对另一个问题的建议代码后从批处理文件中获得的结果。现在,我希望看到以下内容

: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 

我以第3行和第5行为例,因为它们经常返回“请求超时”

2 个答案:

答案 0 :(得分:1)

对此的快速而肮脏的解决方案是,假设您已经有一个大型的日志文件要处理,那就是创建一个新的批处理文件来过滤结果。

当进行硬编码时,这确实很简单,但是如果您想要动态结果,则需要对其进行大量修改。

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

答案 1 :(得分:0)

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 /?以获得帮助。

如果您想了解其他命令, 查看command /?,其中命令代表 您需要帮助的命令。

也查看Using command redirection operators