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

问题描述 投票:0回答:1

我想用提示变量显示一个数组的内容

所以,我编写以下代码:

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

但是显示内容没有成功

你能帮我修一下吗?

arrays windows batch-file variable-expansion
1个回答
0
投票

嗯...好吧,说实话,如果您 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
- 首选,因为它避免了对潜在随机用户输入的处理。

© www.soinside.com 2019 - 2024. All rights reserved.