Связанные с:
Скрипт для назначения и удаления произвольных вторичных IP-адресов для интерфейса

Я пытаюсь дополнить скрипт в приведенном выше вопросе, проверяя вводимые пользователем данные, чтобы скрипт работал только с действительными IP-адресами и масками подсетей. Я знаю, что есть ряд различных регулярных выражений, которые будут проверять IP-адреса, но я не знаю, как (или даже если есть способ) использовать это для переменных в моем пакетном скрипте с собственными командами Windows XP.

Может кто-нибудь указать мне правильное направление, здесь?

2 ответа2

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.

---- whops забыл проверить, является ли шлюз сетевым адресом / широковещательным адресом. ----

0

Вы можете использовать FindStr с RegEx :

/r : использует строки поиска как регулярные выражения. Findstr интерпретирует все метасимволы как регулярные выражения, если вы не используете /l.

Использование регулярных выражений с findstr

Findstr способен найти точный текст, который вы ищете в любом ASCII-файле или файлах. Однако иногда у вас есть только часть информации, которую вы хотите сопоставить, или вы хотите найти более широкий спектр информации. В таких случаях findstr обладает мощной возможностью поиска шаблонов текста с использованием регулярных выражений.

Регулярные выражения - это нотация для определения шаблонов текста, в отличие от точных строк символов. В нотации используются буквенные символы и метасимволы. Каждый символ, который не имеет специального значения в синтаксисе регулярного выражения, является литеральным символом и соответствует вхождению этого символа. Например, буквы и цифры являются буквальными символами. Метасимвол - это символ со специальным значением (оператор или разделитель) в синтаксисе регулярного выражения.

В следующей таблице перечислены метасимволы, которые принимает findstr.

Помните, что система RegEx FindStr не так надежна, как многие другие, поэтому не все регулярные выражения будут работать без небольшой модификации.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .