Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Наболевшее IF и GOTO... (http://forum.oszone.net/showthread.php?t=350292)

epoddubniy 15-12-2021 11:46 2975242

Наболевшее IF и GOTO...
 
Здравствуйте. Помогите пожалуйста отредактировать код, чтобы если условие выполнялось интерпретатор переходил на соответствующую метку.
Необходимо чтобы, если имя домена в переменной не совпадает ни с одним из 4 вариантов, то возвращался на метку :DOMEN, если совпадает, то на соответствующую метку
А у меня получается, что если не совпадает, то он просто выходит, а если совпадает, то переходит на метку :ODIN

Код:

netsh interface ipv4 show ipaddresses

echo vvedi interface, ip-adress, domen ZAGLAVNIMY ODIN DVA TRI skip
set /p "interface="
set /p "ipstatic="
set /p "ImyaDomena="

:DOMEN

if "%ImyaDomena%" neq "ODIN" If "%ImyaDomena%" neq "DVA" If "%ImyaDomena%" neq "TRI" If "%ImyaDomena%" neq "skip" (call :DOMEN) else (call :"%ImyaDomena%")

:ODIN
netsh interface ip set address name="%interface%" static %ipstatic% 255.255.248.0 192.168.6.1
netsh interface ip set dns "%interface%" static 192.168.6.2
netsh interface ip add dns "%interface%" 0.0.0.0
ncpa.cpl
exit

:DVA
netsh interface ip set address name="%interface%" static %ipstatic% 255.255.248.0 192.168.7.1
netsh interface ip set dns "%interface%" static 192.168.7.2
netsh interface ip add dns "%interface%" 0.0.0.0
ncpa.cpl
exit

:TRI
netsh interface ip set address name="%interface%" static %ipstatic% 255.255.248.0 192.168.0.10
netsh interface ip set dns "%interface%" static 192.168.0.2
netsh interface ip add dns "%interface%" 192.168.0.12
ncpa.cpl
exit

:skip
rem ili mojet prosto exit napisat
set "comm=netsh interface ipv4 dump"
for /f tokens^=2^ delims^=^" %%a in ('"%comm%|find /i "publish""') do set interfaceauto=%%a
netsh interface ip set address %interfaceauto% dhcp
netsh interface ipv4 set dns name="%interfaceauto%" source=dhcp
ncpa.cpl
exit


alpap 15-12-2021 14:13 2975257

Код:

@echo off
set "a=1"
set "b=2"
set "c=3"
set "d=4"

::------
if "%a%"=="1" call :#a "%a%"
if "%b%"=="2" call :#b "%b%"
if "%c%"=="3" call :#c "%c%"
call :#d "%d%"

pause& exit
::------

:#a
  echo %~1
exit /b

:#b
  echo %~1
exit /b

:#c
  echo %~1
exit /b

:#d
  echo %~1
exit /b


megaloman 15-12-2021 14:51 2975259

Не понимаю, что должно делаться по :DOMEN, поэтому выделил в отдельную процедуру.
Код:

@Echo Off
cls
        Echo vvedi interface, ip-adress, domen ZAGLAVNIMY ODIN DVA TRI skip
        Set /P "ImyaDomena="

        Set /A ErrorLevel=0
        If Not "%ImyaDomena%"=="ODIN" If Not "%ImyaDomena%"=="DVA" If Not "%ImyaDomena%"=="TRI" If /I Not "%ImyaDomena%"=="skip"  Call :DOMEN
        If %ErrorLevel%==0 Call :%ImyaDomena%
pause
Exit /B

:DOMEN
        Echo "DOMEN"
Exit /B 2

:ODIN
        Echo "ODIN"
Exit /B 0

:DVA
        Echo "DVA"
Exit /B 0

:TRI
        Echo "TRI"
Exit /B 0

:skip
        Echo "skip"
Exit /B 0

Если без анализа на заглавные буквы
Код:

@Echo Off
cls
        Echo vvedi interface, ip-adress, domen ZAGLAVNIMY ODIN DVA TRI skip
        Set /P "ImyaDomena="

        2>nul Call :%ImyaDomena% ||Call :DOMEN
pause
Exit /B

:DOMEN
        Echo "DOMEN"
Exit /B

:ODIN
        Echo "ODIN"
Exit /B

:DVA
        Echo "DVA"
Exit /B

:TRI
        Echo "TRI"
Exit /B

:skip
        Echo "skip"
Exit /B


megaloman 15-12-2021 16:36 2975281

Не вчитываясь в смысл, немного изменил подход, в процедурах делается одно и то же, но с разными данными:
Код:

@Echo Off
cls
        netsh interface ipv4 show ipaddresses

        Set ODIN="255.255.248.0 192.168.6.1"  "192.168.6.2" "0.0.0.0"
        Set  DVA="255.255.248.0 192.168.7.1"  "192.168.7.2" "0.0.0.0"
        Set  TRI="255.255.248.0 192.168.0.10" "192.168.0.2" "192.168.0.12"

        Echo vvedi: &Echo ======&Echo.

        Set /P "interface=interface ="
        Set /P "ipstatic=ip-adress ="
        Set /P "ImyaDomena=domen ZAGLAVNIMY ODIN DVA TRI skip ="
        Echo.

        Set /A ErrorLevel=0

        If /I "%ImyaDomena%"=="skip" (
                Call :skip
        ) Else (
                If Not "%ImyaDomena%"=="ODIN" If Not "%ImyaDomena%"=="DVA" If Not "%ImyaDomena%"=="TRI"  Call :DOMEN
        )

        If %ErrorLevel%==0 Call :ImyaDomena "%interface%" "%ipstatic%" %%%ImyaDomena%%%
pause
Exit /B

:skip
        rem ili mojet prosto exit napisat
Echo        set "comm=netsh interface ipv4 dump"
Echo        for /f tokens^=2^ delims^=^" %%a in ('"%comm%|find /i "publish""') do set interfaceauto=%%a
Echo        netsh interface ip set address %interfaceauto% dhcp
Echo        netsh interface ipv4 set dns name="%interfaceauto%" source=dhcp
Echo        ncpa.cpl

Exit /B 1

:ImyaDomena

Echo        netsh interface ip set address name=%1 static %~2 %~3
Echo        netsh interface ip set dns %1 static %~4
Echo        netsh interface ip add dns %1 %~5
Echo        ncpa.cpl

Exit /B

:DOMEN
        Echo "DOMEN"
Exit /B 2

В боевом режиме уберите красные Echo

epoddubniy 15-12-2021 19:36 2975311

Цитата:

Цитата megaloman
Не понимаю, что должно делаться по :DOMEN, поэтому выделил в отдельную процедуру. »

Планировал, если неправильно введу имя домена (например, 4ETYRE), чтобы интерпретатор меня вернул снова к вводу домена

epoddubniy 15-12-2021 21:55 2975322

megaloman, объясните пожалуйста в чем отличие exit /b 0 от exit /b 1 и exit /b 2 и для чего это используется и что будет если этим пренебречь (гуглил. Не нашел понятного объяснения). Спасибо!

megaloman 15-12-2021 22:42 2975328

Цитата:

Цитата epoddubniy
Планировал, если неправильно введу имя домена (например, 4ETYRE), чтобы интерпретатор меня вернул снова к вводу домена »

При вводе не надо давать возможность эту ошибку совершить. Здесь жесткий контроль.
Код:

@Echo Off
cls
        Set @@1="255.255.248.0 192.168.6.1"  "192.168.6.2" "0.0.0.0"
        Set @@2="255.255.248.0 192.168.7.1"  "192.168.7.2" "0.0.0.0"
        Set @@3="255.255.248.0 192.168.0.10" "192.168.0.2" "192.168.0.12"

        netsh interface ipv4 show ipaddresses

        Echo vvedi: &Echo ======&Echo.

        Set /P "interface=interface ="
        Set /P "ipstatic=ip-adress ="

        Echo Select number of Domen
        CHOICE /C C0123 /N /M "C-завершить, 0-skip, 1-ODIN, 2-DVA, 3-TRI"
        Set /A Out=%Errorlevel%
        Echo.

        If %Errorlevel%==1 Exit /B
        If %Errorlevel%==2 Call :Skip &Exit /B
        Set /A Out=%Errorlevel%-2

        Call :ImyaDomena "%interface%" "%ipstatic%" %%@@%Out%%%
pause
Exit /B

:skip
        rem ili mojet prosto exit napisat
Echo        set "comm=netsh interface ipv4 dump"
Echo        for /f tokens^=2^ delims^=^" %%a in ('"%comm%|find /i "publish""') do set interfaceauto=%%a
Echo        netsh interface ip set address %interfaceauto% dhcp
Echo        netsh interface ipv4 set dns name="%interfaceauto%" source=dhcp
Echo        ncpa.cpl

Exit /B 1

:ImyaDomena

Echo        netsh interface ip set address name=%1 static %~2 %~3
Echo        netsh interface ip set dns %1 static %~4
Echo        netsh interface ip add dns %1 %~5

        ncpa.cpl

Exit /B

Цитата:

Цитата epoddubniy
в чем отличие exit /b 0 от exit /b 1 и exit /b 2 и для чего это используется и что будет если этим пренебречь »

Проделайте Exit /?
Цитата:

Цитата Exit /?
Завершает программу CMD.EXE (интерпретатор команд) или текущий пакетный
файл-сценарий.

EXIT [/b] [exitCode]

/B Предписывает завершить текущий пакетный файл-сценарий вместо
завершения CMD.EXE. Если выполняется вне пакетного
файла-сценария, то будет завершена программа CMD.EXE

exitCode Указывает цифровое значение. Если указан ключ /B, определяет
номер для ERRORLEVEL. В случае завершения работы CMD.EXE,
устанавливает код завершения процесс с данным номером.

Я применил ненулевые коды возврата, чтобы анализировать, вызывалась ли процедура :DOMEN или :skip и, если не вызывалась, обрабатывать процедуру (ы) с данными.

epoddubniy 15-12-2021 22:42 2975329

Ну почему же он не смотря на то, что я в переменную ImyaDomena сохранил значение TRI ПЕРЕХОДИТ НА МЕТКУ :ODIN?!

Код:

netsh interface ipv4 show ipaddresses

Set /A ErrorLevel=0
rem этот ключ обозначает, что выражение в правой стороне равенства является числом

echo vvedi interface, ip-adress, domen  ZAGLAVNIMY ODIN DVA TRI skip
set /p "interface="
set /p "ipstatic="
set /p "ImyaDomena="

:DOMEN

If not "%ImyaDomena%"=="ODIN" If not "%ImyaDomena%"=="DVA" If not "%ImyaDomena%"=="TRI" If not "%ImyaDomena%"=="skip" call :DOMEN
rem если значение переменной не равно ни одному из 4 значений "домена", то возвращаемся на :DOMEN

If %ErrorLevel%==0 Call :%ImyaDomena%
rem если 0==0 (это сравнение чисел) то переходит на соответствующую метку


:ODIN
netsh interface ip set address name="%interface%" static %ipstatic% 255.255.248.0 192.168.6.1
netsh interface ip set dns "%interface%" static 192.168.6.2
netsh interface ip add dns "%interface%" 0.0.0.0
ncpa.cpl
exit /b

:DVA
netsh interface ip set address name="%interface%" static %ipstatic% 255.255.248.0 192.168.7.1
netsh interface ip set dns "%interface%" static 192.168.7.2
netsh interface ip add dns "%interface%" 0.0.0.0
ncpa.cpl
exit /b

:TRI
netsh interface ip set address name="%interface%" static %ipstatic% 255.255.248.0 192.168.0.10
netsh interface ip set dns "%interface%" static 192.168.0.2
netsh interface ip add dns "%interface%" 192.168.0.12
ncpa.cpl
exit /b

:skip
rem ili mojet prosto exit napisat
set "comm=netsh interface ipv4 dump"
for /f tokens^=2^ delims^=^" %%a in ('"%comm%|find /i "publish""') do set interfaceauto=%%a
netsh interface ip set address %interfaceauto% dhcp
netsh interface ipv4 set dns name="%interfaceauto%" source=dhcp
ncpa.cpl
exit /b


megaloman 15-12-2021 23:29 2975340

epoddubniy,
Ваш исправленный вариант
Код:

@Echo Off
netsh interface ipv4 show ipaddresses

rem этот ключ обозначает, что выражение в правой стороне равенства является числом

:DOMEN
echo vvedi interface, ip-adress, domen  ZAGLAVNIMY ODIN DVA TRI skip
set /p "interface="
set /p "ipstatic="
set /p "ImyaDomena="

If not "%ImyaDomena%"=="ODIN" If not "%ImyaDomena%"=="DVA" If not "%ImyaDomena%"=="TRI" If not "%ImyaDomena%"=="skip" GoTo :DOMEN

Call :%ImyaDomena%

Pause
Exit /B


:ODIN
Echo netsh interface ip set address name="%interface%" static %ipstatic% 255.255.248.0 192.168.6.1
Echo netsh interface ip set dns "%interface%" static 192.168.6.2
Echo netsh interface ip add dns "%interface%" 0.0.0.0
Echo ncpa.cpl
exit /b

:DVA
Echo netsh interface ip set address name="%interface%" static %ipstatic% 255.255.248.0 192.168.7.1
Echo netsh interface ip set dns "%interface%" static 192.168.7.2
Echo netsh interface ip add dns "%interface%" 0.0.0.0
Echo ncpa.cpl
exit /b

:TRI
Echo netsh interface ip set address name="%interface%" static %ipstatic% 255.255.248.0 192.168.0.10
Echo netsh interface ip set dns "%interface%" static 192.168.0.2
Echo netsh interface ip add dns "%interface%" 192.168.0.12
Echo ncpa.cpl
exit /b

:skip
rem ili mojet prosto exit napisat
Echo set "comm=netsh interface ipv4 dump"
Echo for /f tokens^=2^ delims^=^" %%a in ('"%comm%|find /i "publish""') do set interfaceauto=%%a
Echo netsh interface ip set address %interfaceauto% dhcp
Echo netsh interface ipv4 set dns name="%interfaceauto%" source=dhcp
Echo ncpa.cpl
exit /b

Я поставил везде Echo для отладки
Цитата:

Цитата epoddubniy
Ну почему же он не смотря на то, что я в переменную ImyaDomena сохранил значение TRI ПЕРЕХОДИТ НА МЕТКУ :ODIN?! »

Любой код исполняется последовательно. Смотрите Ваш вариант:
Вы пишите TRI. Затем у Вас Call :%ImyaDomena% что приводит к вызову и выполнению Call :TRI
После этого интерпритатор делает следующую исполнимую строку, которая следует за меткой :Odin и код продолжает выполняться до Exit
В чем ошибка: каждая программная единица должна завершаться, как вариант, Exit,структура кода должна быть:
Код:

.........
Call :Proc1
.........
Call :Proc2
.........
.........
.........
Call :Procnnnnnnn
.........
.........
.........
Exit /B
:Proc1
.........
.........
.........
Exit
:Proc2
.........
.........
.........
Exit
:Procnnnnnnnnnnnnnnn
.........
.........
.........
Exit
.........
.........
.........

Цитата:

Цитата epoddubniy
Это вообще реально осмыслить и понять самостоятельно? Не потратив на это всю жизнь? Простите, просто накипело... »

ИМХО, учиться надо всю жизнь. И на CMD свет клином не сошелся. Можно конечно всё самостоятельно, но корона, надеюсь, не упадёт, если задавать вопросы там где отвечают.

wasp14 16-12-2021 01:30 2975347

Код:

choice /?
типа того 3

epoddubniy 16-12-2021 11:50 2975374

megaloman, мое почтение и признание Вам! Спасибо большое и за примеры, и за разъяснения (в который раз, возможно, даже одно и то же), и за труды (!) (что тратите свое личное время на написание постов и разъяснения), и за не безразличие (что помогаете таким новичкам как я вникнуть в эту науку)!!!


Время: 23:46.

Время: 23:46.
© OSzone.net 2001-