Показать полную графическую версию : [решено] Наболевшее IF и GOTO...
epoddubniy
15-12-2021, 11:46
Здравствуйте. Помогите пожалуйста отредактировать код, чтобы если условие выполнялось интерпретатор переходил на соответствующую метку.
Необходимо чтобы, если имя домена в переменной не совпадает ни с одним из 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
@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
Не понимаю, что должно делаться по :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
Не вчитываясь в смысл, немного изменил подход, в процедурах делается одно и то же, но с разными данными:@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
Не понимаю, что должно делаться по :DOMEN, поэтому выделил в отдельную процедуру. »
Планировал, если неправильно введу имя домена (например, 4ETYRE), чтобы интерпретатор меня вернул снова к вводу домена
epoddubniy
15-12-2021, 21:55
megaloman, объясните пожалуйста в чем отличие exit /b 0 от exit /b 1 и exit /b 2 и для чего это используется и что будет если этим пренебречь (гуглил. Не нашел понятного объяснения). Спасибо!
megaloman
15-12-2021, 22:42
Планировал, если неправильно введу имя домена (например, 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
в чем отличие exit /b 0 от exit /b 1 и exit /b 2 и для чего это используется и что будет если этим пренебречь »Завершает программу CMD.EXE (интерпретатор команд) или текущий пакетный
файл-сценарий.
EXIT [/B] [exitCode]
/B Предписывает завершить текущий пакетный файл-сценарий вместо
завершения CMD.EXE. Если выполняется вне пакетного
файла-сценария, то будет завершена программа CMD.EXE
exitCode Указывает цифровое значение. Если указан ключ /B, определяет
номер для ERRORLEVEL. В случае завершения работы CMD.EXE,
устанавливает код завершения процесс с данным номером.
Я применил ненулевые коды возврата, чтобы анализировать, вызывалась ли процедура :DOMEN или :skip и, если не вызывалась, обрабатывать процедуру (ы) с данными.
epoddubniy
15-12-2021, 22:42
Ну почему же он не смотря на то, что я в переменную 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
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 для отладкиНу почему же он не смотря на то, что я в переменную 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
.........
.........
.........
Это вообще реально осмыслить и понять самостоятельно? Не потратив на это всю жизнь? Простите, просто накипело... »
ИМХО, учиться надо всю жизнь. И на CMD свет клином не сошелся. Можно конечно всё самостоятельно, но корона, надеюсь, не упадёт, если задавать вопросы там где отвечают.
choice /?
типа того 3 (http://forum.oszone.net/post-2968305-3.html)
epoddubniy
16-12-2021, 11:50
megaloman, мое почтение и признание Вам! Спасибо большое и за примеры, и за разъяснения (в который раз, возможно, даже одно и то же), и за труды (!) (что тратите свое личное время на написание постов и разъяснения), и за не безразличие (что помогаете таким новичкам как я вникнуть в эту науку)!!!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC