2012-08-27 48 views
1

我正在處理一個腳本以獲取每列的最大長度,我試圖在_c1 ... n vars中存儲最大長度的長度。列數未知。DOS使用EnableDelayedExpansion批量嵌套變量名稱

我能夠獲得每列的長度,創建變量來存儲每個集合_c!i! =!n!,n是長度爲 ,但爲了設置特定列的最大長度,我需要將當前值與最大值進行比較,並使用類似!_c !! i!哪些不起作用,有什麼想法如何引用變量的哪部分名稱來自另一個變量?

謝謝...

回答

2

我假設你正在使用的延遲擴展字符,因爲你是一組括號內的工作「()」。這樣做會讓你的過程更加困難。我知道這種方法比較容易閱讀,但編碼起來很困難。

在括號裏面,我知道只有一種方法可以訪問一個變量,這個變量是由一個或多個變量構建的。那就是使用call函數使組合變量「激活」。此方法適用於括號內部和外部。

這裏是一個小例子:

@echo off 
setlocal enabledelayedexpansion 
(
    set i=10 
    set _c!i!=something 
    :: below is equivalent to echo !_c10! 
    call echo %%_c!i!%% 
) 
endlocal 

輸出:

something 

可以在XP做幾乎在它前面使用CALL的一切,你能沒有它,但還是越早不能調用像if這樣的內部命令,只能調用像FIND.EXE這樣的「外部」程序。

如果你能可能使用call :label聲明上班一套支架之外,你可以簡單地訪問這樣的變量:

@echo off 
setlocal enabledelayedexpansion 
set i=10 
set _c!i!=something 

:: The below 2 statements are equivalent to `echo %_c10%` 
echo !_c%i%! 
call echo %%_c!i!%% 

endlocal 

輸出:

something 
something 
1

的CALL技術建議由詹姆斯K將工作,但它是相對緩慢,可能是不安全的,取決於變量的內容。

下看起來比較複雜,但它顯著更快,更可靠的是:

for %%A in (!i!) do echo !_c%%A! 
1

你的情況有可能是第三種方案是可能的,如果你的變量只包含數字。

@echo off 
setlocal enabledelayedexpansion 
(
    set i=10 
    set _c!i!=4711 

    set /a tmp=_c!i! 
    echo !tmp! 
) 

這工作,爲SET /A可以訪問一個變量的內容沒有明確的擴張charaters的NEDD。