来自用户输入的批处理变量被区别对待
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.
中解释了所有这些变体的更多详细信息
我正在尝试使用 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.
中解释了所有这些变体的更多详细信息