![使用批处理脚本验证用户输入的 IP 地址](https://linux22.com/image/1298471/%E4%BD%BF%E7%94%A8%E6%89%B9%E5%A4%84%E7%90%86%E8%84%9A%E6%9C%AC%E9%AA%8C%E8%AF%81%E7%94%A8%E6%88%B7%E8%BE%93%E5%85%A5%E7%9A%84%20IP%20%E5%9C%B0%E5%9D%80.png)
我正在尝试通过验证用户输入来增强上述问题中的脚本,以便该脚本仅适用于有效的 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 系统不如其他许多系统那么强大,因此并非所有正则表达式都能在不进行少许修改的情况下发挥作用。