Пакетный файл для проверки IP-адреса и установки местоположения на основе октета - PullRequest
1 голос
/ 01 мая 2020

Я собрал пакетный файл на основе информации, которую нашел здесь. Как ни странно, более ранняя версия, казалось, работала правильно дома, как только я взял ее на работу, она не работала. И все мои модификации не могут это исправить. Мой босс и я застряли.

@echo off
setlocal
for /f "usebackq tokens=2 delims=:" %%f in (`ipconfig ^| findstr /c:"IPv4 Address"`) do (
    for /f "tokens=1-4 delims=. " %%a in ("%%f") do (
        set octetA=%%a set octetB=%%b set octetC=%%c set octetD=%%d 
        if %octetB% equ 10 goto :setschool
        )
    )

:setschool
if %octetC% geq 0 if %octetC% leq 3 set school=DIC
if %octetC% geq 16 if %octetC% leq 19 set school=AT
if %octetC% geq 48 if %octetC% leq 51 set school=BE
if %octetC% geq 64 if %octetC% leq 67 set school=BH
if %octetC% geq 80 if %octetC% leq 83 set school=CN
if %octetC% geq 112 if %octetC% leq 115 set school=LC
if %octetC% geq 128 if %octetC% leq 131 set school=LX
if %octetC% geq 144 if %octetC% leq 147 set school=RG
if %octetC% geq 160 if %octetC% leq 163 set school=UN
if %octetC% geq 176 if %octetC% leq 179 set school=WA
if %octetC% geq 192 if %octetC% leq 195 set school=WI
if %octetC% geq 208 if %octetC% leq 211 set school=BOE


echo %school%
goto :eof

Он выдает ошибку при первом 'if', потому что для octetB еще ничего не установлено. И все же код перед тем, как он должен был его установить. Все наши проводные DHCP-адреса начинаются с 10.10. Именно поэтому он проверяет на 10, что должно означать, что он игнорирует наши беспроводные, автоматически настраиваемые IP-адреса и виртуальные сетевые адаптеры. Если я вручную запускаю строки перед «если», то получается то, что я ожидаю, с правильно установленными октетами.

Ответы [ 4 ]

0 голосов
/ 01 мая 2020

Вот пример пакетного файла с аркой Rem, показывающий исправление ваших проблем согласно моему первоначальному комментарию:

@Echo Off

Rem Undefine any existing octet variables.

For /F "Delims==" %%G In ('Set octet 2^>NUL') Do Set "%%G="

Rem Retrieve the IPv4 string from the IPConfig command.
Rem And set each octet to individual variables.

For /F "Tokens=2 Delims=:" %%G In (
    '"%__AppDir__%ipconfig.exe 2>NUL | %__Appdir__%find.exe "IPv4""'
) Do For /F "Tokens=1-4 Delims=. " %%H In ("%%G"
) Do Set "octet1=%%H" & Set "octet2=%%I" & Set "octet3=%%J" & Set "octet4=%%K"

Rem Check to see if any octet variables are defined, i.e. IPv4 found.
Rem If not print message, wait for response and end the script.

Set octet >NUL 2>&1 || (Echo IPConfig failed to retrieve an IP address.
    Pause & GoTo :EOF)

Rem From here you can make your comparisons:

Rem First ensure that a variable named school is not defined.

Set "school="

Rem Check to see if your second octet was 10.
Rem Then make your comparisons using the value of the third octet.

If %octet2% Equ 10 If Defined octet3 (
    If %octet3% GEq 0   If %octet3% LEq 3   Set "school=DIC"
    If %octet3% GEq 16  If %octet3% LEq 19  Set "school=AT"
    If %octet3% GEq 48  If %octet3% LEq 51  Set "school=BE"
    If %octet3% GEq 64  If %octet3% LEq 67  Set "school=BH"
    If %octet3% GEq 80  If %octet3% LEq 83  Set "school=CN"
    If %octet3% GEq 112 If %octet3% LEq 115 Set "school=LC"
    If %octet3% GEq 128 If %octet3% LEq 131 Set "school=LX"
    If %octet3% GEq 144 If %octet3% LEq 147 Set "school=RG"
    If %octet3% GEq 160 If %octet3% LEq 163 Set "school=UN"
    If %octet3% GEq 176 If %octet3% LEq 179 Set "school=WA"
    If %octet3% GEq 192 If %octet3% LEq 195 Set "school=WI"
    If %octet3% GEq 208 If %octet3% LEq 211 Set "school=BOE")

Rem As your comparisons do not currently cover all possible octet values,
Rem This is a check to see if the school variable was actually defined.
Rem If not print message, otherwise print the content of the school variable.

If Not Defined school (Echo The school variable was not defined.
    Echo Reason: & If %octet2% Neq 10 (Echo The second octet was not 10.
    ) Else If Defined octet3 (Echo The third octet failed the comparisons.
        ) Else Echo Your returned IP address was corrupted.) Else Echo %school%

Rem Wait to ensure that any messages can be read, if not run from cmd.exe.

Pause

Rem End script.

GoTO :EOF

Скрипт содержит некоторые дополнения, разработанные для обеспечения разумной обратной связи в случае возникновения ошибок.


Не стесняйтесь использовать эту версию с арконом un Rem для завершения или в своей производственной среде .
@Echo Off
For /F "Delims==" %%G In ('Set octet 2^>NUL')Do Set "%%G="
For /F "Tokens=2 Delims=:" %%G In (
    '"%__AppDir__%ipconfig.exe 2>NUL|%__Appdir__%find.exe "IPv4""'
)Do For /F "Tokens=1-4Delims=. " %%H In ("%%G"
)Do Set "octet1=%%H"&Set "octet2=%%I"&Set "octet3=%%J"&Set "octet4=%%K"
Set octet>NUL 2>&1||(Echo IPConfig failed to retrieve an IP address.
    Pause&GoTo :EOF)
Set "school="
If %octet2% Equ 10 If Defined octet3 (
    If %octet3% GEq 0 If %octet3% LEq 3 Set "school=DIC"
    If %octet3% GEq 16 If %octet3% LEq 19 Set "school=AT"
    If %octet3% GEq 48 If %octet3% LEq 51 Set "school=BE"
    If %octet3% GEq 64 If %octet3% LEq 67 Set "school=BH"
    If %octet3% GEq 80 If %octet3% LEq 83 Set "school=CN"
    If %octet3% GEq 112 If %octet3% LEq 115 Set "school=LC"
    If %octet3% GEq 128 If %octet3% LEq 131 Set "school=LX"
    If %octet3% GEq 144 If %octet3% LEq 147 Set "school=RG"
    If %octet3% GEq 160 If %octet3% LEq 163 Set "school=UN"
    If %octet3% GEq 176 If %octet3% LEq 179 Set "school=WA"
    If %octet3% GEq 192 If %octet3% LEq 195 Set "school=WI"
    If %octet3% GEq 208 If %octet3% LEq 211 Set "school=BOE")
If Not Defined school (Echo The school variable was not defined.
    Echo Reason:&If %octet2% Neq 10 (Echo The second octet was not 10.
    )Else If Defined octet3 (Echo The third octet failed the comparisons.
        )Else Echo Your returned IP address was corrupted.)Else Echo %school%
Pause
GoTO :EOF
0 голосов
/ 01 мая 2020

Требуется отложенное расширение.

не проверено

@echo off
setlocal enabledelayedexpansion
for /f "usebackq tokens=2 delims=:" %%f in (`ipconfig ^| findstr /c:"IPv4 Address"`) do (
    for /f "tokens=1-4 delims=. " %%a in ("%%f") do (
        set octetA=%%a & set octetB=%%b & set octetC=%%c & set octetD=%%d 
        if "!octetB!" equ "10" goto :setschool
        )
    )
0 голосов
/ 01 мая 2020

Я подозреваю, что вывод ipconfig отличается дома и на работе. Вы используете те же операционные системы на них? С одинаковыми настройками языка? Содержат ли выходные данные ipconfig на обеих машинах строку IPv4 Address при проверке вручную?
Но я ничего не могу сказать, не зная упомянутую вами "более раннюю версию, которая сработала". Вы можете попробовать использовать более простую строку поиска, которая является общей на обеих машинах, например IPv4. И, возможно, вы захотите добавить переключатель /I к вызову findStr, чтобы установить для него значение «игнорировать регистр».

Попробуйте проверить равенство с помощью if "%%b" == "10" goto setschool (удалите двоеточие, замените% octetB%). Я думаю, что% octetB% доступен только для for для l oop, если вы работаете с отложенным раскрытием переменных.

Вам нужно поместить каждую команду set в свою собственную строку внутри для l oop .

С этими изменениями у меня работает хотя бы под Win10.

0 голосов
/ 01 мая 2020

Вот как я узнаю, какой IP su bnet используют наши машины:

ipconfig^|findstr /i /c:"ip address"^|findstr /c:"10.11.1"&&set loc=AAA&&goto :continue
ipconfig^|findstr /i /c:"ipv4 address"^|findstr /c:"10.11.1"&&set loc=AAA&&goto ipconfig^|findstr /i /c:"ip address"^|findstr /c:"192.168.4."&&set loc=BBB&&goto :continue
:continue
ipconfig^|findstr /i /c:"ipv4 address"^|findstr /c:"192.168.4."&&set loc=BBB&&goto :continue
set loc=unknown
:continue

Я думаю, что «IP-адрес» взят из WinXP или Win7.

...