Próbuję rozszerzyć skrypt w powyższym pytaniu, sprawdzając dane wejściowe użytkownika, aby skrypt działał tylko z prawidłowymi adresami IP i maskami podsieci. Wiem, że dostępnych jest wiele różnych wyrażeń regularnych, które sprawdzają adresy IP, ale nie wiem, w jaki sposób (lub nawet jeśli jest sposób) użyć tego w stosunku do zmiennych w moim skrypcie wsadowym z natywnymi poleceniami systemu Windows XP.
Majstrowałem. Nie pytaj mnie dlaczego ... ale tutaj jest dość obszerne sprawdzenie dla twojego adresu IP / bramy / maski podsieci:
@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
Działa nawet w widoku perspektywicznym i 7.
---- które zapomniało sprawdzić, czy brama jest adresem sieciowym / adresem transmisji. ----
Łał. Będę musiał z tym usiąść i czasami go rozdzielić. Dzięki.
Iszi
Nadal próbuję zrozumieć, dlaczego to wszystko zrobiłem. imho ... Jedyny mylący bit to sprawdzanie maski podsieci, zacząłem od -2 i podwajałem ją wielokrotnie. dlaczego liczba ujemna? pliki wsadowe są przetwarzane w środowisku 32-bitowym (nawet w 64-bitowych oknach) z podpisaną liczbą całkowitą. -2 = 0xFFFFFFFE = 11111111111111111111111111111110. Początkowo podwoję to, zanim zacznę używać tego jako maski ... zaczynamy od 11111111111111111111111111111100, co tłumaczy się jako 255.255.255.252, co jest pierwszą użyteczną maską podsieci.
TheCompWiz
Powinien sprawdzić następujące elementy: są wartościami w każdym oktecie między 0 a amp; 255. czy IP zaczyna się od 127 ... czy maska podsieci jest rzeczywiście ważna ... czy IP to adres sieciowy lub adres transmisji ... jest bramą w tej samej podsieci co IP ... itd ...
TheCompWiz
Łał. To o wiele więcej, niż chciałbym to sprawdzić. Byłbym w porządku, gdyby każdy oktet był naprawdę <255; Gdybyś mógł dodać więcej komentarzy do kodu, aby pomóc wyjaśnić użycie i funkcje niektórych poleceń, byłoby świetnie. Jeśli nie, wyedytuję go, kiedy będę miał czas, żeby samemu go rozebrać. Dzięki jeszcze raz!
Iszi
Również pierwsze trzy SET linie powinny być SET /P ponieważ celem jest sprawdzenie poprawności adresów IP wprowadzonych przez użytkownika - nieuwzględnionych w skrypcie.
/ r : Używa ciągów wyszukiwania jako wyrażeń regularnych. Findstr interpretuje wszystkie metaznaki jako wyrażenia regularne, chyba że użyjesz / l.
Używanie wyrażeń regularnych z findstr
Findstr jest w stanie znaleźć dokładny tekst, którego szukasz
dowolny plik lub pliki ASCII. Czasami jednak masz tylko część
informacje, które chcesz dopasować, lub chcesz znaleźć szerszy zakres
informacji. W takich przypadkach findstr ma potężne możliwości
wyszukuj wzory tekstu za pomocą wyrażeń regularnych.
Wyrażenia regularne są notacją do określania wzorców tekstu, jak
w przeciwieństwie do dokładnych ciągów znaków. Notacja używa literału
znaki i metaznaki. Każda postać, która nie ma
specjalne znaczenie w składni wyrażeń regularnych jest dosłowne
postać i dopasowuje wystąpienie tej postaci. Na przykład,
litery i cyfry są znakami dosłownymi. Metaznakiem jest a
symbol o specjalnym znaczeniu (operator lub separator) w
składnia wyrażeń regularnych.
Poniższa tabela zawiera metaznaki akceptowane przez findstr.
Pamiętaj, że system RegEx FindStr nie jest tak solidny, jak wiele innych, więc nie wszystkie wyrażenia regularne będą działać bez drobnych modyfikacji.
SET
linie powinny byćSET /P
ponieważ celem jest sprawdzenie poprawności adresów IP wprowadzonych przez użytkownika - nieuwzględnionych w skrypcie.Możesz użyć FindStr z RegEx:
Pamiętaj, że system RegEx FindStr nie jest tak solidny, jak wiele innych, więc nie wszystkie wyrażenia regularne będą działać bez drobnych modyfikacji.
źródło
Findstr
znajdzie tekst, ale czy może wrócić do skryptu wsadowego, czy tekst został znaleziony w sposób, który mogę wykorzystaćIF
komunikat?