Search code examples
batch-filefilternested-for-loop

Batch File Filter loop output


The code runs a very simple process of pinging multiple addresses endlessy and outputting the results to a log file until manually stopped.

@echo off
title ping_logger
set d1=%date:~4%
set d2=%d1:/=-%
set t1=%time::=.%
set t2=%t1: =%
set host=X.X.X.1;X.X.X.162
set hostname=%host:;=+%
set pinghostname=%host:;= and %
set logfile=Log_%hostname%_%ComputerName%_%d2%_%t2%.csv
setlocal enableextensions ENABLEDELAYEDEXPANSION
set counter=0
for %%A IN (%host%) DO (
    set /a counter+=1
)
endlocal && set counter=%counter%
echo Target Host(s) = %host%>%logfile%
echo Pinging %pinghostname% with 32 bytes of data: >>%logfile%
timeout %counter% >NUL
:Ping
FOR %%A IN (%host%) DO (
    for /F "tokens=* skip=2" %%A in ('ping %%A -n 1 ') do (
        echo %date:~4%, %time:~0,2%:%time:~3,2%:%time:~6,2%, %%A>>%logfile%
        echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2%, %%A
    )
)
IF (%counter% LSS 2)  timeout 1 >NUL
GOTO Ping

The output is capturing too much into the log file. I'm looking to only get the first line from each response such as the highlighted lines

enter image description here


Solution

  • :DoPing
    FOR %%A IN (%host%) DO (
        set "pung="
        for /F "tokens=* skip=2" %%A in ('ping %%A -n 1 ') do  if not defined pung (
            echo %date:~4%, %time:~0,2%:%time:~3,2%:%time:~6,2%, %%A>>%logfile%
            echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2%, %%A
            set "pung=Y"
        )
    )
    IF (%counter% LSS 2)  timeout 1 >NUL
    GOTO DoPing
    

    (I'm allergic to using keywords/executable names as labels)

    Simply set a flag value pung to nothing so that it is undefined when the pings start. On reporting the first line, set pung to non-empty, so it is then defined and the remining report lines are suppressed.

    Next loop of %%A clears pung before issuing the ping for the next host...


    Another way:

    :DoPing
    FOR %%A IN (%host%) DO (
        for /F "tokens=1* skip=2" %%A in ('ping %%A -n 1 ') do if "%%A" == "Reply" (
            echo %date:~4%, %time:~0,2%:%time:~3,2%:%time:~6,2%, %%A %%B>>%logfile%
            echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2%, %%A %%B
        )
    )
    IF (%counter% LSS 2)  timeout 1 >NUL
    GOTO DoPing
    

    This time, see whether the first token is the string Reply and only write the report if this is so.