我有以下脚本应该设置一个环境变量%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
是外部的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-Block,因为在解析块时会评估百分比扩展,因此在ENDLOCAL
执行后该值将可用.