来自用户输入的批处理变量被区别对待

batch variable from user input treated differently

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

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

但是,当我尝试根据用户输入创建变量 j,并使用它来使用 !something[%%j]! 调用变量 something[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 . . .

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

@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​

您混淆了参数%%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.

中解释了所有这些变体的更多详细信息