我正在尝试在批处理脚本中打印数组的元素:
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
有很大的开销;并且解释并不真正支持数组,它只是一种命名变量的巧妙方法,因此它们看起来像数组。