This is a question for the batch pro\'s i guess. Seems a lot of people do stumble over IP veriffication while batching, while just using windows built in functinallity, but
I assumed you want to review IP numbers placed inside a text file. If the IP's appear at fixed positions inside lines in the file, for example, at third token like this:
IP number: 172.16.0.0/12
Then you may extract the IP number and separate its parts with a FOR /F command, and then review they in any way you wish:
setlocal EnableDelayedExpansion
set wantedNumbers=0,128,192,224,240,248,252,254,255
for /F "tokens=3" %%n in ('findstr /r "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*" theFile.txt') do (
for /F "tokens=1-4 delims=./" %%a in ("%%n") do (
if %%a neq 255 echo First octet is not 255 & goto error
if "!wantedNumbers:%%b=!" equ "%wantedNumbers%" echo Second octet bad & goto error
if "!wantedNumbers:%%c=!" equ "%wantedNumbers%" echo Third octet bad & goto error
if "!wantedNumbers:%%d=!" equ "%wantedNumbers%" echo Fourth octet bad & goto error
echo The IP %%n is correct
)
)
If the IP numbers are not at fixed positions, you need another, existent solution.
However, if the IP is stored in an individual variable (you have not indicated this point), just eliminate the first for
and replace %%n
by the value of the variable.
EDIT: New method added
Edit 2: List of numbers/ranges added
I devised a different way to solve this problem via the following subroutine:
@echo off
rem ValidateIP.bat: Validate an IP4 address
rem Antonio Perez Ayala
if "%~1" neq "" goto validateIP
echo Validate an IP4 address using several successive testings on it
echo/
echo call ValidateIP.bat ipAddress 1:ipRange1 2:ipRange2 ... N:ipRangeN
echo/
echo Each ipRange is comprised of an "errorlevel" followed by a colon and
echo 4 groups separated by dots of anyone of the following:
echo/
echo - An asterisk, that match any value between 0 and 255.
echo - A number, that match just that value.
echo - Two numbers separated by hypen, that match any value in that range.
echo - A list of numbers and/or ranges separated by number-sign (#).
echo/
echo At end, the value placed before the colon of the *last* matching ipRange
echo is returned in ERRORLEVEL; two or more ipRanges may return the same value.
echo If no ipRange is given, 1:*.*.*.* is assumed.
echo If no ipRange is matched, return zero.
echo/
echo Some examples:
echo/
echo call ValidateIp %%IPaddress%% 1:0-254.*.*.0-254 2:172.16-30.0-254.1-254
echo/
echo set subNET=0#128#192#224#240#248#252#254#255
echo call ValidateIP %%IPaddress%% 1:255.%%subNET%%.%%subNET%%.%%subNET%%
goto :EOF
:validateIP ipAddress [#:ipRange] ...
setlocal EnableDelayedExpansion
echo %~1| findstr /B /E /R "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*" > NUL
if errorlevel 1 exit /B 0
for /F "tokens=1-4 delims=." %%a in ("%~1") do set p1=%%a& set p2=%%b& set p3=%%c& set p4=%%d
set "ipRanges=%* "
set ipRanges=%ipRanges:* =%
if not defined ipRanges set ipRanges=1:*.*.*.*
set ipRanges=%ipRanges::*=:0-255%
set ipRanges=%ipRanges:.*=.0-255%
set return=0
for %%a in (%ipRanges%) do for /F "tokens=1,2 delims=:" %%b in ("%%a") do (
set /A fields=0, i=0
set ipRange=%%c
for %%d in ("!ipRange:.=" "!") do (
set /A this=0, i+=1
set range=%%~d
for %%e in ("!range:#=" "!") do for /F "tokens=1-3 delims=-" %%i in ("!i!-%%~e-%%~e") do (
if !p%%i! geq %%j if !p%%i! leq %%k set this=1
)
set /A fields+=this
)
if !fields! equ 4 set return=%%b
)
exit /B %return%
Using previous subroutine, this particular problem may be solved this way:
set "subNET=0#128#192#224#240#248#252#254#255"
call ValidateIp %theIP% 1:0-254.*.*.0-254 2:10.0-254.0-254.0-254 2:172.16-30.0-254.1-254 2:192.168.0-254.0-254 3:127.0-254.0-254.0-254 4:255.%subNET%.%subNET%.%subNET% 5:0.*.*.*
if %errorlevel% equ 1 (
set ret=public
) else if %errorlevel% equ 2 (
set ret=private
) else if %errorlevel% equ 3 (
set ret=local
) else if %errorlevel% equ 4 (
set ret=subnetmask
) else if %errorlevel% equ 5 (
set ret=sourcenetwork
) else (
echo Invalid IP address
goto :EOF
)
Or in this shorter way:
set i=0
for %%a in (public private local subnetmask sourcenetwork) do (
set /A i+=1
set result[!i!]=%%a
)
set "subNET=0#128#192#224#240#248#252#254#255"
call ValidateIp %theIP% 1:0-254.*.*.0-254 2:10.0-254.0-254.0-254 2:172.16-30.0-254.1-254 2:192.168.0-254.0-254 3:127.0-254.0-254.0-254 4:255.%subNET%.%subNET%.%subNET% 5:0.*.*.*
if defined result[%errorlevel%] (
set ret=!result[%errorlevel%]!
) else (
echo Invalid IP address
goto :EOF
)