Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 设置启用延迟扩展的环境变量_Batch File - Fatal编程技术网

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
后该值可用