[英]Setting an environment variable with delayed expansion enabled
我有以下脚本应设置环境变量%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%
我应该如何正确地做到这一点?
每个setlocal
都会创建一个新的变量范围。
通过退出批处理文件,此作用域将被endlocal
或隐式破坏。
您必须在范围生存endlocal barrier
保护您的变量(通常称为endlocal barrier
)。
在一个被调用的函数中,不可能对外部SETLOCAL
进行ENDLOCAL
(这不是不可能的,只有高级技术才能实现)。
因此,您必须修改您的代码。
@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
后该值将可用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.