我尝试设置批处理菜单,允许一次多项选择,然后运行所有功能。函数的顺序与函数将在没有外部错误的情况下运行这一事实无关。这是我到目前为止的代码。
@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:=%
来解决这个问题,但我一直收到错误。
错误:
要么关闭回声,只选择调用选择变量。
帮助这将是惊人的,提前谢谢。
答案 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
)