设置环境变量并启用延迟扩展
我有以下脚本应该设置环境变量%NUMBER%
:
I have the following script that should set an environment variable %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
变量进行回显时,未在控制台窗口中设置它.
When I do run this code in a command prompt window, and do an echo of the NUMBER
variable, it is not set in console window.
d:\> ECHO %NUMBER%
%NUMBER%
我应该如何正确执行此操作?
How should I do this correctly?
每个setlocal
创建一个新的变量范围.
此作用域将使用endlocal
销毁,或者通过退出批处理文件隐式删除.
Each setlocal
creates a new variable scope.
This scope will be destroyed with endlocal
or implicit by exiting the batch file.
您必须在范围生存期内保护您的变量(通常称为endlocal barrier
).
You have to safe your variables over the scope lifetime (often called endlocal barrier
).
在调用的函数中,不可能ENDLOCAL
外部SETLOCAL
(并非不可能,而只能使用
In a called function it's not possible to ENDLOCAL
an outer SETLOCAL
(not impossible, but only with advanced technics).
So you have to modify your code.
@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块,因为在解析该块时会评估扩展百分比,因此该值将在执行ENDLOCAL
之后可用.
The trick is to build an ENDLOCAL-Block with parenthesis, as the percent expansion is evaluated when the block is parsed, so the value will be available after the ENDLOCAL
is executed.