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

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

Ответить
Настройки темы
CMD/BAT - [решено] Область видимости переменной или как передать значения из подпрограммы

Новый участник


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

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


Имеется скрипт в котором часть кода вынесена в подпрограммы
Как передать значения переменных которые пристроились внутри подпрограммы в глобальную область видимости?

Код: Выделить весь код
<тут начало кода>
call:Подпрограмма
<тут еще немного кода>
echo %per1%%per2%%per3%                :: Должно вывести "ОдинДваТри"
pause
<тут конец кода>

:Подпрограмма
setlocal enableextensions enabledelayedexpansion
Set per1=Один
Set per2=Два
Set per3=Три
endlocal & set  per1=%per1% & set  per2=%per2%& set  per3=%per3%
exit /b
Ошибка думаю в последней строке подпрограммы, буду благодарен за подсказку

Отправлено: 12:47, 26-11-2018

 

Ветеран


Contributor


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

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


wlad1164,
У меня работает
Код: Выделить весь код
@Echo Off
cls
	Call :Sub
	echo %per1% %per2% %per3%
pause
GoTo :Eof

:Sub
SetLocal EnableExtensions EnableDelayedExpansion
	Set per1=Один
	Set per2=Два
	Set per3=Три
Endlocal & set  per1=%per1% & set  per2=%per2%& set  per3=%per3%
exit /b
Еще красивее
Код: Выделить весь код
@Echo Off
cls
	Call :Sub "Kuku1" "Kuku2" "Kuku3"
	echo %Kuku1% %Kuku2% %Kuku3%
pause
GoTo :Eof

:Sub
SetLocal EnableExtensions EnableDelayedExpansion
	Set per1=Один
	Set per2=Два
	Set per3=Три
Endlocal & set %~1=%per1% & set %~2=%per2%& set %~3=%per3%
exit /b

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


Последний раз редактировалось megaloman, 26-11-2018 в 13:36.

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

Отправлено: 13:28, 26-11-2018 | #2



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

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


Новый участник


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

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


megaloman, Действительно, проблема проявляется когда call:подпрограмма помещена внутрь IF
Код: Выделить весь код
cls
Set Mode=Man
if "%Mode%"=="Man" (
		Call :Sub
		echo Mode MAN
		echo %per1% %per2% %per3%
	pause
	)
	
	pause
exit 
GoTo :Eof

:Sub
SetLocal EnableExtensions EnableDelayedExpansion
	Set per1=Один
	Set per2=Два
	Set per3=Три
Endlocal & set  per1=%per1% & set  per2=%per2%& set  per3=%per3%
exit /b
Можно ли что то с этим сделать?

Возникла мысль вынести в конец скрипта (после команды exit) части кода, вроде как сработало, но нормально и так делать?
Код: Выделить весь код
cls
Set Mode=Man
if "%Mode%"=="Man" (
goto:НачалоMan
:КонецMan
echo %per1% %per2% %per3%
	)
	
	pause
exit 

GoTo :Eof

:Sub
SetLocal EnableExtensions EnableDelayedExpansion
	Set per1=Один
	Set per2=Два
	Set per3=Три
Endlocal & set  per1=%per1% & set  per2=%per2%& set  per3=%per3%
exit /b

:НачалоMan
	Call :Sub
	echo Mode MAN
	goto:КонецMan
exit /b

Отправлено: 14:29, 26-11-2018 | #3


Ветеран


Contributor


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

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


wlad1164,
Варианты
Код: Выделить весь код
@Echo Off
cls
	Set "Mode=Man"
	if Not "%Mode%"=="Man" GoTo :Cont
	Call :Sub
	echo %per1% %per2% %per3%
	:Cont
	Echo kuku
pause
GoTo :Eof

:Sub
SetLocal EnableExtensions EnableDelayedExpansion
	Set per1=Один
	Set per2=Два
	Set per3=Три
Endlocal &set per1=%per1% &set per2=%per2% &set per3=%per3%
exit /b
Код: Выделить весь код
@Echo Off
cls
	Set "Mode=Man"
	if "%Mode%"=="Man" Call :Sub
	echo %per1% %per2% %per3%
pause
GoTo :Eof
Код: Выделить весь код
@Echo Off
cls
SetLocal EnableExtensions EnableDelayedExpansion
	Set "Mode=Man"
	if "%Mode%"=="Man" (
		Call :Sub
		echo !per1! !per2! !per3!
	) Else (
		Echo kuku
	)
Endlocal
pause
GoTo :Eof

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

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

Отправлено: 14:46, 26-11-2018 | #4


Старожил


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

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


@megaloman а можно передать *имя* переменной и сделать sub которая бы создала переменную с этим именем ? чтобы использовать как нибудь вот так:
Код: Выделить весь код
call :sub /project/artifactId ARTIFACT_ID
echo ARTIFACT_ID=%ARTIFACT_ID%
call :sub //project/groupId GROUP_ID
echo GROUP_ID=%GROUP_ID%
и т.д.
спасибо

Отправлено: 18:08, 27-11-2018 | #5


Ветеран


Contributor


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

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


Serguei Kouzmine,
Похоже можно, хотя не очень понял, что нужно. В самом первом моём посте подобный вариант рассматривался (переменные kuku)
Код: Выделить весь код
@Echo Off
cls
	Call :Sub "Om mani padme hum" "Mantra"
	Echo Mantra=%Mantra%

	Echo:
	Call :Sub "/project/artifactId" "ARTIFACT_ID"
	Echo ARTIFACT_ID=%ARTIFACT_ID%

	Echo:
	Call :Sub "//project/groupId" "GROUP_ID"
        Echo GROUP_ID=%GROUP_ID%

	Echo:
	Echo 222222:
	Call :Sub2 "/project/artifactId" "ARTIFACT_ID"
	Echo ARTIFACT_ID=%ARTIFACT_ID%

	Echo:
	Echo 222222:
	Call :Sub2 "//project/groupId" "GROUP_ID"
        Echo GROUP_ID=%GROUP_ID%

pause
GoTo :Eof

:Sub
	Set "%~2=%~1"
exit /b

:Sub2
	Set "%~2=%~2"
exit /b

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

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

Отправлено: 18:41, 27-11-2018 | #6


Старожил


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

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


@megaloman
спасибо сейчас попробую
Это помоему весьма полезно для java pom.xml "все в одном флаконе" javafx проектов на стадии разработки . потому что "все" не всегда озачает "и spring".

и чтобы собрать и запустить немного по разному jar

Код: Выделить весь код
set COMMAND=^
java ^
  -cp %TARGET%\%APP_JAR%;%TARGET%\lib\* ^
  %APP_PACKAGE%.%MAIN_CLASS% ^
  %1 %2 %3 %4 %5 %6 %7 %8 %9
echo %COMMAND%>&2
%COMMAND%
нужен "лончер"
на маке и linux это шел а на ***де это нехорошо делатьв Powershell - очень медленный
то есть cmd + mshta из pom.xml читает параметры и превращает в переменные - скрипт то лучше чтоб выглядел похоже для разных платформ.

Отправлено: 20:19, 27-11-2018 | #7



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Установка значения переменной из значечния реестра idlazarev_alex@vk Скриптовые языки администрирования Windows 1 09-02-2015 12:04
PHP область видимости переменной morebeauty Вебмастеру 5 04-06-2014 01:21
[решено] Присвоить значения переменной из текстового файла Cem AutoIt 9 05-03-2014 19:11
CMD/BAT - [решено] Увеличение значения имени переменной или считывание строки файла в переменную VokaMut Скриптовые языки администрирования Windows 12 26-11-2012 15:54
[решено] cms Joomla, подключение файла в модуль, область видимости переменных zvezda_t Вебмастеру 10 24-02-2011 11:45




 
Переход