簡體   English   中英

設置環境變量並啟用延遲擴展

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM