2014-05-24 67 views
3

我試圖設置一個批處理菜單,允許一次多選,然後運行所有功能。這些函數的順序是不相關的,因爲這些函數將在外部錯誤下運行。這是我迄今爲止的代碼。批量循環菜單(多選)

@Echo off 
Echo Please Enter the corrasponding numbers separated by a space or colon (,) 
Echo for the Options that you would like to run e.g. 1 4,3 2 
Echo Option #1 
Echo Option #2 
Echo Option #3 
Echo Option #4 
Echo. 

SET /P Selection=Please Select Restore Options? 
echo You chose: %Selection% 

setlocal ENABLEDELAYEDEXPANSION 
Set /a index = 0 
FOR %%A IN (%Selection%) DO (
SET Array[!index!] = %%A 
SET /a index += 1 
) 

for /F "tokens=2 delims==" %%s in ('set Array[') DO (
set string=%%s 
set string=%string: =% 
echo %string% 
Call :Opt%string% 
) 

pause 
goto :EOF 


:Opt1 
ECHO Option 1's code 
GOTO :EOF 

:Opt2 
ECHO Option 2's code 
GOTO :EOF 

:Opt3 
ECHO Option 3's code 
GOTO :EOF 

:Opt4 
ECHO Option 4's code 
GOTO :EOF 

代碼我已經工作到試圖調用數組veriable並將其附加到一個呼叫例如Call :Opt%%s 我有的probelm是數組變量不斷出現一個空間繼續選定的變量。所以我試圖與設置string=%string:=%對抗,但我不斷收到錯誤。

錯誤:

任一回聲關閉並且只有選擇獲取調用與出所選擇的變量。

幫助這將是驚人的,在此先感謝。

回答

3

的問題,開始是

SET Array[!index!] = %%A 
------------------^-^---- = aditional spaces 

這aditional的空間使用,讓您用的名稱中aditional的空間,並在其價值的aditional的空間中的變量結束。因此,最好使用

SET "Array[!index!]=%%A" 

的原因echo錯誤是你忘記了使用延遲擴展在for %%s環。您可以更改循環內的%string%變量,並嘗試在同一個循環內使用更改後的值。

for /F "tokens=2 delims==" %%s in ('set Array[') DO (
    set "string=%%s" 
    set "string=!string: =!" 
    echo !string! 
    Call :Opt!string! 
) 

但在原來的set指示的修正,使其不需要更換的空間。

2

MC ND解決了代碼中的大部分問題。

一個小問題 - 標點符號是逗號,不是一個冒號;-)

但還有一個更嚴重的問題,如果用戶輸入3個選擇,並且已經有了另外一個命名的數組變量[4]?它會運行用戶未輸入的額外值。它甚至會嘗試運行存儲在Array [anythingGoes中的值。

你已經有了存儲在「索引」中的數值,爲什麼不使用它呢?迭代數組的更常見和更簡單的方法是使用FOR/L循環。這也保留了原來的順序。一旦你有10個或更多的條目,你的方式會改變順序。 (我知道你說的順序並不重要,但爲什麼要改變順序,如果你不就得了?)

setlocal enableDelayedExpansion 
for /l %%N in (1 1 %index%) do (
    echo !Array[%%N]! 
    call :Opt!Array[%%N]! 
) 

但我不明白了一個道理惹的數組在所有。解析用戶輸入的循環可以直接調用函數。現在你甚至不需要延遲擴展。

for %%A in (%Selection%) do (
    echo %%A 
    call :Opt%%A 
) 
+0

感謝dbenham,最後的和平代碼實際上使這個腳本變得簡單很多。 – Tea