设置环境变量并启用延迟扩展 [英] Setting an environment variable with delayed expansion enabled

查看:146
本文介绍了设置环境变量并启用延迟扩展的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下脚本应该设置环境变量%NUMBER%:

I have the following script that should set an environment variable %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变量进行回显时,未在控制台窗口中设置它.

When I do run this code in a command prompt window, and do an echo of the NUMBER variable, it is not set in console window.

d:\> ECHO %NUMBER%
%NUMBER%

我应该如何正确执行此操作?

How should I do this correctly?

推荐答案

每个setlocal创建一个新的变量范围.
此作用域将使用endlocal销毁,或者通过退出批处理文件隐式删除.

Each setlocal creates a new variable scope.
This scope will be destroyed with endlocal or implicit by exiting the batch file.

您必须在范围生存期内保护您的变量(通常称为endlocal barrier).

You have to safe your variables over the scope lifetime (often called endlocal barrier).

在调用的函数中,不可能ENDLOCAL外部SETLOCAL(并非不可能,而只能使用

In a called function it's not possible to ENDLOCAL an outer SETLOCAL (not impossible, but only with advanced technics).
So you have to modify your code.

@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之后可用.

The trick is to build an ENDLOCAL-Block with parenthesis, as the percent expansion is evaluated when the block is parsed, so the value will be available after the ENDLOCAL is executed.

这篇关于设置环境变量并启用延迟扩展的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆