在BATCH中的FOR命令中使用计数变量

时间:2016-05-12 00:21:00

标签: batch-file

我正在尝试使用命令:“set n = 0”“for / f %% i in('dir / a:d / b')do(set / a n + = 1)&(set var%n%= %% i)“ - 它总是将%% i设置为var0,但我可以看到”set n + = 1“正在工作。如何使用“n”为每个回合创建一个不同的变量?

喜欢:var1,var2,var3 ..对于目录中的每个文件夹。

无论答案是什么,我都需要'n'来保持命令运行的次数(所以程序会知道文件夹的数量)(编辑:是的我知道我的例子提供了这个,我的意思是如果有人改变了代码,'n'仍然需要设置为运行次数)

修改:我查看了页面:Arrays, linked lists and other data structures in cmd.exe (batch) script 并发现它很有用,但我真的不明白正确的用法。 有人可以通过修复我的代码来使用DelayedExpansion或更好地解释如何实现它来帮助我吗?

编辑:伙计们!这不是重复。我试图使用DelayedExpansion并且无法使其工作。我的问题是因为我正在使用的文本编辑器(NotePad ++),这就是为什么我认为我使用DelayedExpansion错误并要求澄清。在下面的答案证明我的代码是正确的之后,我最终自己修复了它。

1 个答案:

答案 0 :(得分:1)

当您在一组括号内创建或更新变量时,您需要使用延迟扩展并使用!variable!而不是%variable%引用该变量。

正如Stephan在his answer中所说,这是因为cmd解释器一次解析整个代码块(一组括号内的所有内容),并在解析时用变量替换变量,而变量用延迟引用扩展方法在运行时进行评估。

@echo off
setlocal enabledelayedexpansion
cls

:: Initialize n to 0
set "n=0"

:: Use delayed expansion to create an array of
:: directories in the current directory
for /f "delims=" %%i in ('dir /a:d /b') do (
    set /a n+=1
    set var!n!=%%i
)

:: Display the list of all var_ found
set var

pause