我想用提示变量显示一个数组的内容
所以,我编写以下代码:
::Create an array
SET country[0]=Albania
SET country[1]=Argentina
SET country[2]=Australia
SET country[3]=Austria
SET country[4]=Belgium
::Create a menu
SET /P C=Type the number of your country, then press ENTER:
SET /A C_num=%C%
ECHO.
for /L %%a in (0, 1, 59) do call ECHO %%a - %%country[%%a]%%
ECHO.
我试过这段代码显示相应的国家:
ECHO %country[!C_num!]%
但是显示内容没有成功
你能帮我修一下吗?
嗯...好吧,说实话,如果您 did 成功了...就不需要问这个问题了...
所以 - 为了解决您的问题,我们需要了解更多信息 首先是关于文件的启动方式。批处理文件的正常启动是
@echo off
setlocal
关闭默认的命令回显以避免屏幕混乱,然后建立一个“本地环境”,它具有有用的属性,当批处理结束时,运行批处理时修改的所有变量都将恢复到它们的原始值(它们在批次开始)。这可以防止在同一会话中运行的后续批处理继承由this批处理所做的修改。
下一期是你的
set
陈述的格式。使用 set "var=value"
设置字符串值 - 这避免了由尾随空格引起的问题。不要分配 "
或终端反斜杠或空格。从元素构建路径名——与直觉相反,这可能会使过程更容易。如果使用语法set var="value"
,则引号成为分配值的一部分。
还有一点怪癖:如果单独按下
Enter,
SET /P "var=Prompt"
不会改变var
。因此,如果 var
最初是空的,它仍然是空的。使用如图所示的引号,您可以在 Prompt
. 的末尾放置一个空格
我建议如果您在 before 要求选择之前显示您的列表会更好 - 它可能会让它更容易一些。
您(可能)有一个很长的列表要显示,其中一些条目是空的。您可以将
%%a
循环修改为 …do if defined country[%%a] echo …
,这可能会通过不显示任何未定义的 country[?]
来缩短显示列表。
I prefer to avoid ADFNPSTXZ (in either case) as metavariables (loop-control variables)
ADFNPSTXZ are also metavariable-modifiers which can lead to difficult-to-find bugs
(See `for/f` from the prompt for documentation)
批处理中的变量总是字符串。可用的数学函数将变量内容转换为数字以执行计算,然后再返回到要分配或
echo
ed 的字符串。因此,将C
“转换”为C_num
实际上没有任何效果。 country[%C%]
与country[%C_num%]
完全相同。
你还没有告诉我们当你尝试
ECHO %country[!C_num!]%
时你会得到什么。你需要彻底了解延迟扩张
所以 - 你需要先调用
delayedexpansion
然后 ECHO !country[%C_num%]!
另一方面,您可以尝试对此进行调整:具有 3 列的菜单 使用
choice
- 首选,因为它避免了对潜在随机用户输入的处理。