【问题标题】:How to count arrays in FOR loops using a variable as index?如何使用变量作为索引计算 FOR 循环中的数组?
【发布时间】:2018-10-15 12:01:03
【问题描述】:

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

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 的值。

有解决办法吗?我对任何事情都持开放态度。

【问题讨论】:

  • 这就是你手头的所有代码吗?您可能遇到了扩展延迟问题。
  • 我将编辑整个代码。
  • 我不敢相信。延迟扩展在 FOR 循环中不起作用...谢谢@SteveFest
  • 延迟扩展适用于 for 循环,但不适用于 for 循环中的所有地方。
  • 您不需要到处延迟扩展,只需将其设置为您需要的区域并禁用您不需要的区域。

标签: arrays windows batch-file cmd ffmpeg


【解决方案1】:

编辑

在您大量更改的批次中(实际上是一个新问题)更改

 call echo !input[%x%]!

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

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

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

【讨论】:

  • 我已经设法修复了程序的那一部分。现在的问题是如何更改FOR 循环内的变量/索引。有什么想法吗?
  • 我明白了!那么CALLFOR 循环之外执行命令?
  • 不,调用强制通过解析器对行进行第二次评估,在第一次传递中,双 %% 被减少到一个,而当前值 !x!插入。在第二遍中,%input[1]%(或任何后续数字)被评估。
  • 那是延迟扩展延迟了?
  • 不完全是,因为在(代码块)内,!x! 是必需的并且有效,为了获得另一个不同的延迟扩展,使用了调用。它不适用于所有命令 - set/echo 做一个 if 例如没有。
【解决方案2】:

感谢@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 循环内扩展的变量。

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

【讨论】:

  • 对不起,你的结论是错误的。原始代码的唯一问题是将call echo !input[%x%]! 行更改为call echo %%input[!x!]%%for %%x in (!x!) do echo !input[%%x]!,如my comment 中所述。您原来的 set /a x += 1 行是正确的,不需要任何更改...也许您误读了 ,然后对 array 元素 使用延迟扩展(而不是索引) . :/
  • 我的定义有误。我仍然将 array element 称为变量。
  • 再次。不需要这两行:set /a j=x + 1for %%j in (!j!) do set x=%%j。这条线实现了同样的事情:set /a x += 1。在这些行中,x索引变量(不是 数组元素),而前面解释的 call %%for 方法仅用于访问数组元素(不要增加一个简单的变量)...
  • 我不敢相信。我正在以set /a x=x += 1 的形式执行set /a x += 1 命令,这就是我需要这两行的原因。我太笨了。
  • 我不关注你;您发布的代码有这一行:set /a x += 1。无论如何,恕我直言,这整个答案毫无意义,应该删除......
猜你喜欢
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 2021-12-13
相关资源
最近更新 更多