【问题标题】:Use a counting variable within a FOR command in BATCH [duplicate]在 BATCH 的 FOR 命令中使用计数变量 [重复]
【发布时间】:2016-09-07 14:26:22
【问题描述】:

我正在尝试使用命令: "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 错误并要求澄清的原因。在下面的答案证明我的代码是正确的之后,我最终自己修复了它。

【问题讨论】:

标签: batch-file


【解决方案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

【讨论】:

  • 我试过了,但是 'set var' 返回 'var!n!=Windows'(Windows 是目录中的最后一个文件夹)确实有 setlocal 和 enabledelayedexpansion
  • @ThatCyanTypo - 那你做错了。完全按照我编写的方式复制并粘贴我的代码。
  • 我发现了问题,由于我在 NotePad++ 中的语法高亮显示,我在不同的行上设置了 setlocal 和 enabledelayedexpansion(当它们在同一行时,它没有显示为工作命令)
  • 是的,Notepad++ 的语法高亮可以做一些调整。
  • 感谢您的帮助!有趣的是我比 BATCH xD 更擅长 Python
猜你喜欢
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 2017-08-04
  • 2022-01-04
相关资源
最近更新 更多