windows 在批处理文件For循环中展开变量

lokaqttq  于 2023-04-22  发布在  Windows
关注(0)|答案(1)|浏览(119)

我想用提示变量显示数组的内容。
所以,我做了以下代码:

::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!]%

但是,它没有成功地显示内容。
你能帮我修一下吗?

fiei3ece

fiei3ece1#

嗯……好吧,TBH,如果你成功了,你就不需要问这个问题了……
所以-为了解决你的问题,我们需要知道更多的信息。首先是关于你的文件是如何开始的。

@echo off
setlocal

它关闭了默认的命令回显,以避免屏幕混乱,然后建立了一个“本地环境”,该环境具有有用的属性,即当批处理结束时,在运行批处理时修改的所有变量都将恢复到其原始值(批处理开始时的值)。这可以防止在同一会话中运行的后续批处理继承 this batch所做的修改。
下一个问题是set语句的格式。使用set "var=value"设置字符串值-这可以避免尾随空格引起的问题。不要分配"或终止反斜杠或空格。从元素构建路径名-这可能会使过程更容易。如果使用语法set var="value",则引号将成为所分配值的一部分。
还有个小怪癖如果只按Enter键,SET /P "var=Prompt"不会改变var。因此,如果var最初是空的,它仍然是空的。使用如图所示的引号,您可以在Prompt的末尾添加一个空格。
我建议你最好在你要求选择之前显示你的列表--这可能会让你更容易一点。
你有一个很长的列表要显示,其中一些条目是空的。你可以修改你的%%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)

批量中的变量是always字符串。可用的数学函数将变量内容转换为数字以执行计算,然后再转换回要分配的字符串或echo ed。因此,“转换”CC_num实际上什么也没有实现。country[%C%]country[%C_num%]完全相同。
您还没有告诉我们您在尝试ECHO %country[!C_num!]%时得到了什么。您需要彻底了解Delayed expansion
因此,您需要首先调用delayedexpansion,然后调用ECHO !country[%C_num%]!
另一方面,您可以尝试调整以下内容:Menu with 3 columns使用choice-首选,因为它避免了处理潜在的随机用户输入。

相关问题