批量循环菜单(多选)

时间:2014-05-24 10:22:09

标签: arrays loops batch-file menu batch-processing

我尝试设置批处理菜单,允许一次多项选择,然后运行所有功能。函数的顺序与函数将在没有外部错误的情况下运行这一事实无关。这是我到目前为止的代码。

@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

我的代码工作到了试图调用Array可验证并将其附加到呼叫的程度,例如Call :Opt%%s 我遇到的问题是数组变量不断出现一个空格继续选定的变量。所以我尝试使用set string=%string:=%来解决这个问题,但我一直收到错误。

错误:

  

要么关闭回声,只选择调用选择变量。

帮助这将是惊人的,提前谢谢。

2 个答案:

答案 0 :(得分:3)

问题的开始是

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

使用此附加空格,因此您最终会得到一个变量,其名称中包含一个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中指示的更正使得无需替换空格。

答案 1 :(得分:2)

MC ND解决了代码的大部分问题。

一个微不足道的问题 - 标点符号是逗号,而不是冒号; - )

但是一个更严重的问题,如果用户输入3个选项,并且已经有一个名为Array [4]的变量怎么办?它将运行用户未输入的额外值。它甚至会尝试运行存储在Array [anythingGoes。

中的值

您已经获得了" index"中存储的值的数量,那么为什么不使用它呢?迭代数组的一种更常见和更简单的方法是使用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
)