2015-02-23 47 views
2

如何在循環中保留多個變量(具有某個前綴)過去endlocal在循環中分配變量經過endlocal

變量在循環聲明中可見,但不是body。

下面是echo而不是變量賦值的示例,以說明變量在for正文中不可見。通常,一個變量賦值會去的地方echo的:

@echo off 

setlocal ENABLEDELAYEDEXPANSION 
set TB_1=test1 
set TB_2=test2 

set TB_ALL_VARS= 
for /F "tokens=1 delims==" %%x in ('set TB_') do (
    set TB_ALL_VARS=%%x !TB_ALL_VARS! 
) 

for %%x in (%TB_ALL_VARS%) do (echo %%x = !%%x!) 
echo END LOCAL 
endlocal & (for %%x in (%TB_ALL_VARS%) do (echo %%x = !%%x!)) 

輸出:

TB_2 = test2 
TB_1 = test1 
END LOCAL 
TB_2 = !TB_2! 
TB_1 = !TB_1! 

正如你所看到的,變量之前ENDLOCAL印刷好的,但ENDLOCAL後不打印。

有沒有一種方法可以保存像過去的endlocal這樣的變量?

回答

4

鑑於你的示例代碼,我想你問的是,「我如何在endlocal之後設置動態數量的變量?」你問的不是非常直觀,但它可能是。將setendlocal複合時,不能使用延遲擴展。解決方案通常可以使用for循環到endlocal & set "var=%%A",該功能只有在變量和值的數量是靜態時纔有效。不幸的是,endlocal & forfor... in... do (endlocal & set)不一樣,因爲您在自己的測試中無疑會發現它。

我的解決辦法是使用宏endlocal後做的設置 - 基本把命令而不是簡單的字符串值到一個變量,然後評估該變量爲一組set命令。

@echo off 
setlocal 

:: // call ":set" subroutine to do the setting 
call :set 

:: // display results 
set subv 

:: // end main runtime 
goto :EOF 


:: // :set subroutine 
:set 
setlocal enabledelayedexpansion 

:: // any number of variables prefixed by "subv" 
set "subv1=1" 
set "subv2=2" 
set "subv3=3" 

:: // init %compound% 
set compound= 

:: // combine all %subvX% variables into a macro of set var1=val1 & set var2=val2, etc 
for /f "delims=" %%I in ('set subv') do set "compound=!compound! & set "%%~I"" 

:: // evaluate set commands as a macro 
endlocal & %compound:~3% 
goto :EOF 

另一種解決方案是回到我所提到的第一個解決方法,在endlocal & set "var=%%A"格式。通常只有當你知道你只會循環一次時纔會使用,比如

for %%I in ("!var!") do endlocal & set "return=%%~I" 

......因爲你不想在本地多次。但是你可以通過使用if not defined這樣做有一個endlocal多值循環:

@echo off 
setlocal 

call :set 
set subv 

goto :EOF 

:set 
setlocal enabledelayedexpansion 
set "subv1=1" 
set "subv2=2" 
set "subv3=3" 
set end= 
for /f "delims=" %%I in ('set subv') do (
    if not defined end endlocal & set end=1 
    set "%%~I" 
) 
goto :EOF 

...因爲endlocalset "%%~I"包含在括號內代碼塊中的變量重新設置你的目標已完成。

3

你試圖使用tunneling,但經過ENDLOCAL不能使用!擴大variables.Try此:

@echo off 

setlocal ENABLEDELAYEDEXPANSION 
set TB_1=test1 
set TB_2=test2 

set TB_ALL_VARS= 
for /F "tokens=1 delims==" %%x in ('set TB_') do (
    set TB_ALL_VARS=%%x !TB_ALL_VARS! 
) 

for %%x in (%TB_ALL_VARS%) do (echo %%x = !%%x!) 
echo END LOCAL 
endlocal & (for %%x in (%TB_ALL_VARS%) do (call echo %%x = %%%%x%%)) 

OR

@echo off 

setlocal ENABLEDELAYEDEXPANSION 
set TB_1=test1 
set TB_2=test2 

set TB_ALL_VARS= 
for /F "tokens=1 delims==" %%x in ('set TB_') do (
    set TB_ALL_VARS=%%x !TB_ALL_VARS! 
) 

for %%x in (%TB_ALL_VARS%) do (echo %%x = !%%x!) 
echo END LOCAL 
endlocal & (for %%x in (%TB_ALL_VARS%) do (
setlocal enableDelayedExpansion 
call echo %%x = !%%x!) 
endlocal 
) 
+0

我嘗試了兩種方法,但這些解決方案都沒有工作 – Rado 2015-02-23 23:35:05