|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Наболевшее IF и GOTO... |
|
|
CMD/BAT - [решено] Наболевшее IF и GOTO...
|
Пользователь Сообщения: 105 |
Профиль | Отправить PM | Цитировать Здравствуйте. Помогите пожалуйста отредактировать код, чтобы если условие выполнялось интерпретатор переходил на соответствующую метку.
Необходимо чтобы, если имя домена в переменной не совпадает ни с одним из 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 |
|
Отправлено: 11:46, 15-12-2021 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать |
Отправлено: 14:13, 15-12-2021 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2710
|
Профиль | Отправить PM | Цитировать Не понимаю, что должно делаться по :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
|
------- Последний раз редактировалось megaloman, 15-12-2021 в 16:33. Отправлено: 14:51, 15-12-2021 | #3 |
Ветеран Сообщения: 2710
|
Профиль | Отправить PM | Цитировать Не вчитываясь в смысл, немного изменил подход, в процедурах делается одно и то же, но с разными данными:
@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 |
------- Последний раз редактировалось megaloman, 15-12-2021 в 16:46. Отправлено: 16:36, 15-12-2021 | #4 |
Пользователь Сообщения: 105
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
|
||
Отправлено: 19:36, 15-12-2021 | #5 |
Пользователь Сообщения: 105
|
Профиль | Отправить PM | Цитировать megaloman, объясните пожалуйста в чем отличие exit /b 0 от exit /b 1 и exit /b 2 и для чего это используется и что будет если этим пренебречь (гуглил. Не нашел понятного объяснения). Спасибо!
|
Отправлено: 21:55, 15-12-2021 | #6 |
Ветеран Сообщения: 2710
|
Профиль | Отправить PM | Цитировать Цитата epoddubniy:
@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 /?
Цитата Exit /?:
|
|||
------- Последний раз редактировалось megaloman, 16-12-2021 в 08:35. Отправлено: 22:42, 15-12-2021 | #7 |
Пользователь Сообщения: 105
|
Профиль | Отправить PM | Цитировать Ну почему же он не смотря на то, что я в переменную 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 |
Последний раз редактировалось epoddubniy, 15-12-2021 в 23:17. Отправлено: 22:42, 15-12-2021 | #8 |
Ветеран Сообщения: 2710
|
Профиль | Отправить PM | Цитировать 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 Цитата epoddubniy:
Вы пишите TRI. Затем у Вас Call :%ImyaDomena% что приводит к вызову и выполнению Call :TRI После этого интерпритатор делает следующую исполнимую строку, которая следует за меткой :Odin и код продолжает выполняться до Exit В чем ошибка: каждая программная единица должна завершаться, как вариант, Exit,структура кода должна быть: ......... Call :Proc1 ......... Call :Proc2 ......... ......... ......... Call :Procnnnnnnn ......... ......... ......... Exit /B :Proc1 ......... ......... ......... Exit :Proc2 ......... ......... ......... Exit :Procnnnnnnnnnnnnnnn ......... ......... ......... Exit ......... ......... ......... Цитата epoddubniy:
|
||
------- Последний раз редактировалось megaloman, 15-12-2021 в 23:44. Отправлено: 23:29, 15-12-2021 | #9 |
Забанен Сообщения: 346
|
типа того 3
|
Отправлено: 01:30, 16-12-2021 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - Нужна помощь с командой goto! | Unkown_User | Скриптовые языки администрирования Windows | 2 | 11-01-2017 21:39 | |
Как заменить Goto | Raf_z | AutoIt | 1 | 25-10-2012 23:51 | |
PowerShell - [решено] Powershell equivalent 'Goto' | dosperados | Скриптовые языки администрирования Windows | 3 | 25-01-2012 14:02 | |
CMD/BAT - [решено] Погите с goto | Tw!ster74 | Скриптовые языки администрирования Windows | 8 | 13-11-2010 11:21 | |
Аналог goto | Frost_Imp | AutoIt | 8 | 24-07-2009 17:14 |
|