Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Наболевшее IF и GOTO...

Ответить
Настройки темы
CMD/BAT - [решено] Наболевшее IF и GOTO...

Пользователь


Сообщения: 105
Благодарности: 1

Профиль | Отправить 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
Благодарности: 564

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@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
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:13, 15-12-2021 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Contributor


Сообщения: 2703
Благодарности: 1683

Профиль | Отправить 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
Если без анализа на заглавные буквы
Код: Выделить весь код
@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:33.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:51, 15-12-2021 | #3


Ветеран


Contributor


Сообщения: 2703
Благодарности: 1683

Профиль | Отправить 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
В боевом режиме уберите красные Echo

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 15-12-2021 в 16:46.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:36, 15-12-2021 | #4


Пользователь


Сообщения: 105
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

Отправлено: 19:36, 15-12-2021 | #5


Пользователь


Сообщения: 105
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

Отправлено: 21:55, 15-12-2021 | #6


Ветеран


Contributor


Сообщения: 2703
Благодарности: 1683

Профиль | Отправить PM | Цитировать


Цитата 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 и, если не вызывалась, обрабатывать процедуру (ы) с данными.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 16-12-2021 в 08:35.

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:42, 15-12-2021 | #7


Пользователь


Сообщения: 105
Благодарности: 1

Профиль | Отправить 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


Ветеран


Contributor


Сообщения: 2703
Благодарности: 1683

Профиль | Отправить 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
Я поставил везде 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 свет клином не сошелся. Можно конечно всё самостоятельно, но корона, надеюсь, не упадёт, если задавать вопросы там где отвечают.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 15-12-2021 в 23:44.

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:29, 15-12-2021 | #9


Забанен


Сообщения: 346
Благодарности: 64

Профиль | Цитировать


Код: Выделить весь код
choice /?
типа того 3
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:30, 16-12-2021 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Наболевшее IF и GOTO...

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход