使用批处理脚本验证用户输入的 IP 地址

使用批处理脚本验证用户输入的 IP 地址

有关的:
用于分配和删除接口的任意辅助 IP 的脚本

我正在尝试通过验证用户输入来增强上述问题中的脚本,以便该脚本仅适用于有效的 IP 地址和子网掩码。我知道有许多不同的正则表达式可用于检查 IP,但我不知道如何(或者甚至不知道是否有办法)使用本机 Windows XP 命令对批处理脚本中的变量进行此操作。

有人能给我指出正确的方向吗?

答案1

我一直在修修补补。不要问我为什么……但这是对您的 ipaddress/gateway/subnet-mask 的相当广泛的检查:

@Echo Off

set NEW-IPADDR=192.168.1.2
set NEW-MASK=255.255.255.240
set NEW-GW=192.168.1.1

set RETURN=isValidIP
goto checkIP

:isValidIP
echo.We are good to go.

REM ---------------------------------------------------------------------
REM Do whatever with the IP/mask/GW here.  The values appear to be valid.
REM ---------------------------------------------------------------------
goto :End

:checkIP
for /f "tokens=1,2,3,4 delims=. " %%a in ("%NEW-IPADDR%") do set ip1=%%a&set ip2=%%b&set ip3=%%c&set ip4=%%d
set /a decIP=(16777216*%ip1%)+(65536*%ip2%)+(256*%ip3%)+%ip4% 2> nil
for /f "tokens=1,2,3,4 delims=. " %%a in ("%NEW-MASK%") do set mask1=%%a&set mask2=%%b&set mask3=%%c&set mask4=%%d
set /a decMask=(16777216*%mask1%)+(65536*%mask2%)+(256*%mask3%)+%mask4% 2> nil
set /a netAddr="%decIP%&%decMask%" 2> nil
for /f "tokens=1,2,3,4 delims=. " %%a in ("%NEW-GW%") do set gw1=%%a&set gw2=%%b&set gw3=%%c&set gw4=%%d
set /a decGW=(16777216*%gw1%)+(65536*%gw2%)+(256*%gw3%)+%gw4% 2> nil
set /a gwNetAddr="%decGW%&%decMask%" 2> nil


set isBadLabel=badIP
if %ip1% EQU 127 (goto :badIP)
if %ip1% EQU 0 (goto :badIP)
set num=%ip1%
call :checkNum
if %badNum% equ 1 (goto :End)
set num=%ip2%
call :checkNum
if %badNum% equ 1 (goto :End)
set num=%ip3%
call :checkNum
if %badNum% equ 1 (goto :End)
set num=%ip4%
call :checkNum
if %badNum% equ 1 (goto :End)

set isBadLabel=badMask
set num=%mask1%
call :checkNum
if %badNum% equ 1 (goto :End)
set num=%mask2%
call :checkNum
if %badNum% equ 1 (goto :End)
set num=%mask3%
call :checkNum
if %badNum% equ 1 (goto :End)
set num=%mask4%
call :checkNum
if %badNum% equ 1 (goto :End)

set isBadLabel=badGW
set num=%gw1%
call :checkNum
if %badNum% equ 1 (goto :End)
set num=%gw2%
call :checkNum
if %badNum% equ 1 (goto :End)
set num=%gw3%
call :checkNum
if %badNum% equ 1 (goto :End)
set num=%gw4%
call :checkNum
if %badNum% equ 1 (goto :End)

set testmask=-2
set bcast=0

:loopmask
  set /a testmask=%testmask%+%testmask%
  if %decmask% EQU %testmask% (set bcast=%testmask%)
if %bcast% neq 0 (goto :goodMask)
if %testmask% geq -16777216 (goto :loopmask)

:badMask
echo.Bad subnet mask. (%NEW-MASK%)  Check and try again.
echo.
goto :End

:badIP
echo.Bad IP Address. (%NEW-IPADDR%)  Check and try again.
echo.
goto :End

:goodMask
set /a bcast="%bcast%^-1"
set /a bcast=%netAddr%+%bcast%
if %decIP% equ %bcast% (goto :badIP)

if %decIP% equ %decGW% (goto :badGW)
if %gwNetAddr% neq %netAddr% (goto :badGW)

if %decGW% equ %bcast% (goto :badGW)
if %decGW% equ %netAddr% (goto :badGW)

goto :goodGW
:badGW
echo.Bad Gateway Address. (%NEW-GW%)  Check and try again.
echo.
goto :End

:goodGW
goto %RETURN%

goto :End

:checkNum
set badNum=0
set /a numval=%num% 2> nil
if "z%num%" neq "z%numval%" (set badNum=1) else (
  if %num% GTR 255 (set badNum=1) else (
    if %num% LSS 0 (set badNum=1)
  )
)
if %badNum% equ 1 (goto %isBadLabel%)
goto :EOF

:End

它甚至可以在 Vista 和 7 中运行。

---- 谁忘了检查网关是否是网络地址/广播地址。----

答案2

您可以使用查找字符串使用 RegEx 的:

/r:使用搜索字符串作为正则表达式。除非您使用 /l,否则 Findstr 会将所有元字符解释为正则表达式。

使用正则表达式和 findstr

Findstr 能够在任何 ASCII 文件中查找您要查找的精确文本。但是,有时您只有要匹配的部分信息,或者想要查找更大范围的信息。在这种情况下,findstr 具有使用正则表达式搜索文本模式的强大功能。

正则表达式是一种用于指定文本模式的符号,与精确的字符串不同。该符号使用文字字符和元字符。在正则表达式语法中没有特殊含义的每个字符都是文字字符,并且与该字符的出现相匹配。例如,字母和数字就是文字字符。元字符是正则表达式语法中具有特殊含义的符号(运算符或分隔符)。

下表列出了 findstr 接受的元字符。 在此处输入图片描述

请记住,FindStr 的 RegEx 系统不如其他许多系统那么强大,因此并非所有正则表达式都能在不进行少许修改的情况下发挥作用。

相关内容