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

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

wlad1164 26-11-2018 12:47 2842672

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

Код:

<тут начало кода>
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

Ошибка думаю в последней строке подпрограммы, буду благодарен за подсказку

megaloman 26-11-2018 13:28 2842679

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


wlad1164 26-11-2018 14:29 2842689

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


megaloman 26-11-2018 14:46 2842694

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


Serguei Kouzmine 27-11-2018 18:08 2842896

@megaloman а можно передать *имя* переменной и сделать sub которая бы создала переменную с этим именем ? чтобы использовать как нибудь вот так:
Код:

call :sub /project/artifactId ARTIFACT_ID
echo ARTIFACT_ID=%ARTIFACT_ID%
call :sub //project/groupId GROUP_ID
echo GROUP_ID=%GROUP_ID%

и т.д.
спасибо

megaloman 27-11-2018 18:41 2842901

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


Serguei Kouzmine 27-11-2018 20:19 2842921

@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 читает параметры и превращает в переменные - скрипт то лучше чтоб выглядел похоже для разных платформ.


Время: 13:26.

Время: 13:26.
© OSzone.net 2001-