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