通过批处理输出到csv

时间:2016-02-16 14:10:56

标签: csv batch-file ping

我从该网站获得了以下大部分批处理文件,并根据我的需要对其进行了修改:

@echo off

set/p host=host Address: 
set logfile=Log_%host%.log
set csfile=pings_%host%.csv

echo Target Host = %host% >%logfile%
netsh interface show interface >>%logfile%
nslookup myip.opendns.com resolver1.opendns.com >>%logfile%
for /f "tokens=*" %%A in ('ping %host% -n 1 ') do (echo %%A>>%logfile% && GOTO Ping)
:Ping
for /f "tokens=* skip=2" %%A in ('ping %host% -n 1 ') do (
    echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2% %%A>>%logfile%
    echo %date%,%time:~0,2%:%time:~3,2%:%time:~6,2%,%%A>>%csfile%
    echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2% %%A
    timeout 1 >NUL 
    GOTO Ping)

.log文件的输出正是我想要的。 csv文件输出如下所示:

02/16/2016 Tue, 8:02:03,Reply from 173.194.115.33: bytes=32 time=16ms TTL=56

我希望至少能看到这样的事情:

02/16/2016 Tue, 8:02:03,Reply from 173.194.115.33:, bytes=32, time=16ms, TTL=56

最理想的是,我希望csv看起来像这样:

Date,Time,IP,Bytes,Time,TTL
02/16/2016 Tue,8:02:03,173.194.115.33,32,16ms,56
02/16/2016 Tue,8:02:04,173.194.115.33,32,17ms,56
...

如果可能的话,我想远离PowerShell。

谢谢, 乔

2 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
SET "destdir=U:\destdir"

set "host=google.com"
set "csfile=%destdir%\pings_%host%.csv"
set "flagfile=%destdir%\flagfile.flg"

:: Ensure flagfile exists
ECHO.>"%flagfile%"
ECHO(Date,Time,IP,Bytes,Time,TTL>"%csfile%"

:PING
IF NOT EXIST "%flagfile%" GOTO :EOF 
for /f "tokens=* skip=2" %%A in ('ping %host% -n 1 ') do (
 FOR /f "tokens=1,4,6,8,10delims=:= " %%P IN ("%time:~0,2% %%A") DO (
     echo %date%,%%P:%time:~3,2%:%time:~6,2%,%%Q,%%R,%%S,%%T>>%csfile%
    )
    echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2% %%A
    timeout 1 >NUL 
    GOTO Ping)
GOTO :EOF

由于您已经对logfile处理进行了排序,因此会生成csvfile。为了方便起见,我已经设置了适合我系统的文件名,并将谷歌用于ping。

这会处理

  

“8回复173.194.115.33:,bytes = 32,time = 16ms,TTL = 56”

假设“回复”(毫无疑问可以根据需要进行门控)使用的分隔符: = 空格它只是一个输出日期数据后跟第一个标记,带标点符号的分钟和秒以及剩余所需标记的逗号分隔列表的问题。

我添加了一个在第一个条目上创建的标志文件。如果删除了标志文件,则批处理停止,因此您不必 Ctrl C 来终止该过程。

答案 1 :(得分:0)

您可以使用FOR循环仅解析您关注的值。

FOR /F "usebackq tokens=1-10 delims==:< " %%A IN (`ping google.com -n 1`) DO (
    REM Only process the response line.
    IF "%%A"=="Reply" (
        ECHO %%C,%%E,%%G,%%I
    )
)

此代码段将以下数据放入CSV格式:

  

IP,字节,时间,TTL

示例输出:

  

74.125.138.138,32,11ms,43

您应该可以非常轻松地将其调整到您的脚本中。