用户输入的批处理变量处理方式不同

时间:2015-02-04 00:23:55

标签: batch-file menu environment-variables

我尝试使用Windows批处理文件创建菜单选项。

当我使用创建变量i的for循环,并使用它来调用!something[%%i]!变量[i]时,它可以很好地工作。

但是,当我尝试从用户输入创建变量j,并使用它来使用!something[%%j]!调用变量[j]时,它不起作用。

我不确定为什么它将变量j与变量i区别对待,但似乎只能使用!j!而不是%%j来调用j

@echo off
setlocal EnableDelayedExpansion

set something[0]=aaaa
set something[1]=bbbb
set something[2]=cccc
set something[3]=dddd
set something[4]=eeee
set something[5]=ffff
set something[6]=gggg

for /l %%i in (0,1,6) do echo %%i. !something[%%i]!

set /p j="Input selection: "
echo.
echo j=%%j
echo j=!j!
echo.
set Selection=!something[%%j]!

echo Selection = !Selection!
pause

以下是示例输出:

0. aaaa
1. bbbb
2. cccc
3. dddd
4. eeee
5. ffff
6. gggg
Input selection: 3

j=%j
j=3

Selection =
Press any key to continue . . .

2 个答案:

答案 0 :(得分:2)

临时%%变量仅在FOR语句中有效。您试图在FOR循环之外使用%% j。以下是获得所需结果的两种方法。

@echo off
setlocal EnableDelayedExpansion

set something[0]=aaaa
set something[1]=bbbb
set something[2]=cccc
set something[3]=dddd
set something[4]=eeee
set something[5]=ffff
set something[6]=gggg

for /l %%i in (0,1,6) do echo %%i. !something[%%i]!

set /p j="Input selection: "
echo.
echo j=%j%
echo.
set Selection=!something[%j%]!

echo Selection = %Selection%
pause
​

@echo off

set something[0]=aaaa
set something[1]=bbbb
set something[2]=cccc
set something[3]=dddd
set something[4]=eeee
set something[5]=ffff
set something[6]=gggg

for /l %%i in (0,1,6) do call echo %%i. %%something[%%i]%%

set /p j="Input selection: "
echo.
echo j=%j%
echo.
call set Selection=%%something[%j%]%%

echo Selection = %Selection%
pause​

答案 1 :(得分:1)

您将参数 %%j变量 %j%混淆。以下示例可能会使这种差异更加明显:

for %%j in (%j%) do set Selection=!something[%%j]!

但是,在这种情况下,您可以直接使用:

set Selection=!something[%j%]!

您也可以使用此表单:

call set Selection=%%something[%j%]%%

不需要延迟扩展,但速度较慢。

但是,如果将set命令放在括号内(即,在多行IF或FOR命令中),则可以使用某些形式。有关所有这些变体的详细信息,请参阅this post