批处理脚本 - 在For循环中创建动态变量名或数组

4
我希望问一下你是否能提供建议。
我不知道是否可以在批处理或数组中创建动态变量名或类似的东西。例如,在for循环之前设置c=0,然后在for循环内设置c=c+1,并使用此数字来创建for循环内的动态变量名称,例如:set entry%c% = 'somestring'。
之后,使用这些编号变量来在for循环外部打印输出,例如: echo %entry1% echo %entry2%
示例:
@echo off

set /a c=1

for %%i in (list.txt) do (

set /a c=c+1
set entry%c% = %%i

)

echo %entry1%
echo %entry2%

感谢您的帮助。

研究延迟扩展变量。 setLocal enableDelayedExpansion - unclemeat
list.txt里面有什么内容? - johny why
2个回答

2

你需要使用延迟扩展变量,否则c将始终扩展为相同的值。

你还需要在set语句中删除空格。 set entry%c% = %%i将创建一个名为(例如)entry1<space>的变量,你必须这样扩展它-%entry1 %。因此,只需删除=运算符周围的那些空格即可。

@echo off

setLocal enableDelayedExpansion
set c=0

for %%i in (list.txt) do (
    set /a c+=1
    set entry!c!=%%i
)

echo %entry1%
echo %entry2%

此外,如果您想循环遍历所有已创建的变量,可以执行以下操作。
for /L %%i in (!c!, -1, 1) do echo !entry%%i!

或者

for /L %%i in (1, 1, !c!) do echo !entry%%i!

2

我会使用

for /f "tokens=1*delims=[]" %%a in ('find /n /v "" list.txt') do set "entry%%a=%%b"

但是需要警告的是

关于IT技术相关内容,请注意
set entry%c% = %%i

批处理对SET语句中的空格非常敏感。如果这个例子能够正常工作,它会将变量命名为"entry1Space",并将其值设置为"Spacethefirstlineofthefile"。

我使用的set "var=value"语法确保了批处理行末尾的任何空格都不包含在分配给var的值中。


+1 这很聪明。我喜欢使用find的/v开关来消除空变量的可能性,当然还有/n来对变量进行编号。非常好的一行代码。 - unclemeat
太好了!谢谢 - 这正是我一直在寻找的。感谢你的帮助。 - damian1baran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接