@echo off SETLOCAL ENABLEDELAYEDEXPANSION REM Get the script's path so all needed files can sit in the same folder SET SCRIPTPATH=%~p0 CD %SCRIPTPATH% REM Dump directory, with each file being a finished subnet scan, into new file scans.txt dir /b nmap*.txt>scans.txt del SCANPARSED.TXT /q SET IPTEMP="" SET SAVTEMP="" SET TLINE="" SET CURRENTLINE="" SET OPSYS=0 SET SUBNETFILE="" REM Read and pass each subnet line in file one at a time to sub 'sub1' for /f "tokens=*" %%A in (scans.txt) do call :SUB1 %%A del tempfile.txt /q del scans.txt /q echo done. ENDLOCAL goto :EOF :SUB1 REM We've got a subnet sent to us SET SUBNETFILE=%1 echo subnetfile=%subnetfile% REM Read each line from SUBNETFILE and pass to sub2 to search for text for /f "tokens=*" %%B in ('TYPE %SUBNETFILE% ^| FIND /V "/?"') do @echo %%B>tempfile.txt & CALL :SUB2 %%B goto :eof :SUB2 REM First, check for lines that have the pipe symbol. Those lines have no valuable data and REM crash the script. If found (errorlevel=0, or not errorlevel=1), then return find /c /i "|" tempfile.txt > nul IF NOT ERRORLEVEL 1 GOTO :EOF findstr /B "SF OS" tempfile.txt > nul IF NOT ERRORLEVEL 1 GOTO :EOF REM Start looking for IP address. If found, send to IPPARSE to parse FOR /F "TOKENS=*" %%C IN (TEMPFILE.TXT) DO SET CURRENTLINE=%%C echo CURRENTLINE=%CURRENTLINE% echo LatestOpenPort=%OPSYS% find /c /i "Nmap scan report for " tempfile.txt > nul echo No new host found=%ERRORLEVEL% REM If the string is found (errorlevel=0, or not 1) then call sub to set IPTEMP and OPSYS REM then return, else continue below and search for open ports IF NOT ERRORLEVEL 1 CALL :IPPARSE REM Get opsys in next two sections. First 22, then 445, since that's the order nmap shows REM Look for SSH Port 22 find /c /i "22/tcp" tempfile.txt > nul IF NOT ERRORLEVEL 1 ( CALL :PARSE22 GOTO :EOF ) REM Look for Windows Port 445 find /c /i "445/TCP" tempfile.txt > nul IF NOT ERRORLEVEL 1 ( CALL :PARSE445 GOTO :EOF ) REM Look for SAV Port 2967 find /c /i "2967/TCP " tempfile.txt > nul IF NOT ERRORLEVEL 1 CALL :PARSE2967 GOTO :EOF REM Parse IP Address :IPPARSE FOR /F "TOKENS=*" %%D IN (TEMPFILE.TXT) DO SET TLINE=%%D echo IPPARSE=%tline% REM Parse using FOR, and set var IPTEMP FOR /F "TOKENS=5 DELIMS= " %%E IN ("%TLINE%") DO @set IPTEMP=%%E SET OPSYS=1 GOTO :EOF REM Next few subroutines are for parsing specific ports for OS :PARSE22 find /c /i "OPEN " tempfile.txt > nul IF NOT ERRORLEVEL 1 ( echo OPEN22=1 SET OPSYS=22 echo opsys22=!opsys! ) ELSE ( echo OPEN22=0 ) GOTO :EOF :PARSE445 find /c /i "OPEN" tempfile.txt > nul IF NOT ERRORLEVEL 1 ( echo OPEN445=1 SET OPSYS=445 echo opsys445=!opsys! ) ELSE ( echo OPEN445=0 ) GOTO :EOF REM Determine Status of SAV port 2967 :PARSE2967 find /c /i "OPEN" tempfile.txt > nul IF ERRORLEVEL 1 ( echo OPEN2967=1 ECHO %IPTEMP%,OPSYS%OPSYS%,2967CLOSED ECHO %IPTEMP%,OPSYS%OPSYS%,2967CLOSED>>SCANPARSED.TXT ) ELSE ( echo OPEN2967=0 ECHO %IPTEMP%,OPSYS%OPSYS%,2967OPEN ECHO %IPTEMP%,OPSYS%OPSYS%,2967OPEN>>SCANPARSED.TXT ) GOTO :EOF