我有以下脚本应该设置一个环境变量%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
Run Code Online (Sandbox Code Playgroud)
当我在命令提示符窗口中运行此代码并执行NUMBER变量的回显时,它不会在控制台窗口中设置.
d:\> ECHO %NUMBER%
%NUMBER%
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能正确?
每个都setlocal创建一个新的变量范围.退出批处理文件时,
此范围将被销毁endlocal或隐含.
您必须在范围生命周期内保护变量(通常称为endlocal barrier).
在一个被调用的函数中,它不可能ENDLOCAL是外部的SETLOCAL(不是不可能的,但只有先进的技术).
所以你必须修改你的代码.
@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
)
...
Run Code Online (Sandbox Code Playgroud)
诀窍是使用括号构建ENDLOCAL-Block,因为在解析块时会评估百分比扩展,因此在ENDLOCAL执行后该值将可用.