如何使用变量作为索引来计算FOR循环中的数组?

时间:2018-05-04 23:53:05

标签: arrays windows batch-file cmd ffmpeg

好。我摆脱了大部分无用的代码,并且一直在修补它,试图找到问题所在,我想我终于找到了它:

Windows'Batch无法编辑将在FOR循环内扩展的变量。

例如:

set /a x=1
Powershell Get-Clipboard> %temp%\ffmpeglist.txt
setlocal enableExtensions enableDelayedExpansion
for /F "delims=| tokens=*" %%A in (%temp%\ffmpeglist.txt) do (
    set input[!x!]=%%A
    call echo !input[%x%]!
    set /a x += 1
)
endlocal

预期行为:

g:\videos\youtube1.mp4
g:\videos\youtube2.mp4
g:\videos\youtube3.mp4
g:\videos\youtube4.mp4
g:\videos\youtube5.mp4

我得到了什么:

g:\videos\youtube1.mp4
g:\videos\youtube1.mp4
g:\videos\youtube1.mp4
g:\videos\youtube1.mp4
g:\videos\youtube1.mp4

无论我做什么,set /a x+= 1都不会更改x的值。

有解决方案吗?我对任何事都持开放态度。

2 个答案:

答案 0 :(得分:1)

修改

在重大改变的批次中(实际上是一个新问题)改变

 call echo !input[%x%]!

 call echo %%input[!x!]%%

如果在(代码块)中,您可能需要延迟扩展以强制实际值, 如果同时使用索引变量,您需要另一级延迟扩展,您可以通过伪调用和双倍百分号来完成

Call set Input=%%input[!x!]%%
mediainfo --Output=Video;%%Height%% !input! > %temp%\ffmpegres%x%.txt

答案 1 :(得分:0)

感谢@Aacini和@LotPings,我得到了答案:

set /a x=1
Powershell Get-Clipboard> %temp%\ffmpeglist.txt
setlocal enableDelayedExpansion
for /f "delims=|" %%A in (%temp%\ffmpeglist.txt) do (
    set input[!x!]="%%A"
    for %%i in (!x!) do echo !input[%%i]!
    set /a x =+ 1
)

问题不是BATCH无法

  

编辑将在FOR循环内部扩展的变量。

但它是以一种不太直接的方式做到的。