Batch file 设置启用延迟扩展的环境变量
我有以下脚本,它应该设置一个环境变量Batch file 设置启用延迟扩展的环境变量,batch-file,Batch File,我有以下脚本,它应该设置一个环境变量%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 BUI
%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
销毁,或通过退出批处理文件隐式销毁
必须在作用域生存期内保护变量(通常称为endlocalbarrier
)
在被调用的函数中,无法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
)
...
诀窍是用括号构建ENDLOCAL块,因为解析块时会计算扩展百分比,因此执行ENDLOCAL
后该值可用