2015-12-08 2 views
2

У меня есть следующий сценарий, который должен установить переменные окружения %NUMBER%:Настройки переменной среды с задержкой расширения позволило

@ECHO OFF 
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION 

SET processed=0 

IF "%~1"=="latest" (
    CALL :LATEST_BUILD_NUMBER %~2 
    ECHO "->%build_number% RETURNS NO DATA" 
    ECHO "->!build_number! GIVES THE BUILD NUMBER BACK" 
    CALL :SET_ENVIRONMENT_VARIABLE !build_number! 
    SET processed=1 
) 

:END 
    ENDLOCAL 
    ECHO ON 
    @EXIT /B 0 

:SET_ENVIRONMENT_VARIABLE 
    ECHO SET "NUMBER=%~1" 
    SET "NUMBER=%~1" 
    @EXIT /B 0 

:LATEST_BUILD_NUMBER 
    REM CALCULATE THE BUILDNUMBER, NOW JUST SET IT 
    set build_number=589 
    EXIT /B 0 

Когда я запускаю этот код в окне командной строки, и сделать отголосок NUMBER переменная, она не устанавливается в окне консоли.

d:\> ECHO %NUMBER% 
%NUMBER% 

Как это сделать правильно?

ответ

5

Каждый setlocal создает новый диапазон переменных.
Эта область будет уничтожена с помощью endlocal или неявной, выходя из командного файла.

Вы должны защитить свои переменные в течение срока действия сферы (часто называемый endlocal barrier).

В вызываемой функции невозможно ENDLOCAL внешний SETLOCAL (не невозможно, но только с advanced technics).
Итак, вам нужно изменить свой код.

@ECHO OFF 
SETLOCAL EnableExtensions EnableDelayedExpansion 

SET processed=0 
SET build_number=0 

IF "%~1"=="latest" (
    CALL :LATEST_BUILD_NUMBER %~2 
    ECHO -^>%build_number% RETURNS NO DATA 
    ECHO -^>!build_number! GIVES THE BUILD NUMBER BACK 
    REM *** CALL :SET_ENVIRONMENT_VARIABLE !build_number! 
    SET processed=1 
) 

:END 
(
    ENDLOCAL 
    set "number=%build_number%" 
    EXIT /B 0 
) 
... 

Хитрость заключается в том, чтобы построить ENDLOCAL-Block с скобкой, так как расширение процента оценивается, когда блок обрабатывается, так что значение будет доступна после того, как ENDLOCAL выполняется.

Смежные вопросы