在批处理脚本中打印数组的元素

在批处理脚本中打印数组的元素

我正在尝试在批处理脚本中打印数组的元素:

for %%i in (*.txt) do (
echo  !array[%n1%]!
set /A n1+=1
)

但是它不打印数组元素。它一遍又一遍地打印相同的内容。我也试过了,!array[!n1!]!但它也不起作用。

答案1

%n1%解析行时会发生正常扩展。任何带括号的代码块(例如 DO() 子句)都会被一次性解析。因此,每次迭代看到的值都是循环运行之前存在的值。

wmz 建议使用 CALL,但正如他所说,它很慢。有一个更好的方法。您可以使用延迟扩展将值传输n1到 FOR 变量,然后使用 FOR 变量作为“数组”索引。

如果您的 REN 命令出现语法错误,则可能是因为文件名包含空格,因此需要将其括在引号中。

for %%F in (*.txt) do (
  for %%N in ("!n1!") do ren "%%F" "!array[%%N]!"
  set /a n1+=1
)

请注意,文件名中 是合法的。由于延迟扩展,!任何包含 的文件名在扩展!时都会被破坏。解决方案是在循环内根据需要打开和关闭延迟扩展。"%%F"

setlocal disableDelayedExpansion
for %%F in (*.txt) do (
  set "name=%%F"
  setlocal enableDelayedExpansion
  for %%N in ("!n1!") do ren "!name!" "!array[%%N]!"
  endlocal
  set /a n1+=1
)
endlocal

答案2

由于解释器的工作方式,它并不像它应该的那样简单。最紧凑的方法是:(
call echo %%array[!n1!]%% 假设setlocal enabledelayedexpansion

请注意,这call有很大的开销;并且解释并不真正支持数组,它只是一种命名变量的巧妙方法,因此它们看起来像数组。

相关内容