在批处理文件的 for 循环中设置随机变量值会产生错误

Posted

技术标签:

【中文标题】在批处理文件的 for 循环中设置随机变量值会产生错误【英文标题】:Setting random variable value in for loop in batch file gives errors 【发布时间】:2021-06-09 06:59:34 【问题描述】:

这是我的代码:

for %%i in ("joined/*.mp4") do (
  set /a result=(%random%*2/32768)+1
  echo %result%
)

它给了我关于 +1 was unexpected at this time 的错误。

我尝试了另一种变体:

for %%i in ("joined/*.mp4") do (
  set /a result=(%random%*2/32768)
  echo %result%
)

它给了我一个关于不平衡括号的错误。

如何正确回显随机变量?

谢谢。 :)

尝试以下代码每次都会给我相同的随机值。如何在循环的每次迭代中更改它?

setlocal EnableDelayedExpansion
for %%i in ("joined/*.mp4") do (
  set /a result= %random%*20/32768 + 1
  echo !result!
)

是否有我可以阅读的资源来详细了解批处理文件的工作原理以及它们的语言(如循环、数组等)?我尝试在 Google 上搜索,但没有找到任何有用的信息。

【问题讨论】:

删除set /a 语句中的括号。您不需要它们并且关闭 ) 过早关闭您的 for 循环。你应该阅读delayed expansion(randomresult 谢谢@Stephan。 :) 代码现在可以工作,但 result 的值似乎在整个循环中保持不变。 我想通了,我需要在任何地方使用!。 :) 【参考方案1】:

正如@Stephan 提供的链接中所述,您需要 !也是随机的。

你可以这样做(由于某种原因,(!random!*20)/32768 触发 "/32768" was unexepected,所以你必须将它分成两行:

setlocal EnableDelayedExpansion
    for %%i in ("joined/*.mp4") do (
        set /a result = !random!*20
        set /a result= !result!/32768 +1
        echo !result!
    )

【讨论】:

谢谢@XouDo。 :) 但是,我无法使用 !result! 的值!在批处理文件中的其他命令中,例如ffmpeg -i "joined/%%~ni.mp4" -i music/!result!.mp3。它向我显示了一个错误music/!result!.mp3: No such file or directory 也许你的路径有问题:你应该使用反斜杠`\`(windows风格的路径)而不是斜杠/(unix风格)。 感谢@XouDo,但这并没有解决错误。我会尝试别的。 :) 好的@RealNoob,让我们知道你什么时候能最终解决你的问题。请注意,一旦在FOR 循环之外,您可以再次使用%result% 而不是!result!【参考方案2】:

使用方括号(括号) 完全没问题,而且我会说更正确,所以你没有理由不能继续这样做。

为您提供一些选择,它们可以继续使用:

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
For %%G In ("joined\*.mp4") Do (
    Set /A result = (!random! * 20 / 32768^) + 1
    Echo !result!
)
Pause
@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
For %%G In ("joined\*.mp4") Do (
    Set /A "result = (!random! * 20 / 32768) + 1"
    Echo !result!
)
Pause
@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
For %%G In ("joined\*.mp4") Do (
    Set /A result = (!random! %% 20^) + 1
    Echo !result!
)
Pause
@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
For %%G In ("joined\*.mp4") Do (
    Set /A "result = (!random! %% 20) + 1"
    Echo !result!
)
Pause

【讨论】:

感谢@Compo。现在的问题是我无法在任何地方使用!result! 的值。它只是保持字面意思!result!。例如,ffmpeg -i "joined/%%~ni.mp4" -i music/!result!.mp3 我已经回答了您提出的问题,包括您使用 @RealNoob 的相同命令,但进行了必要的更正。其余的似乎是一个完全不同的问题,这超出了您提出的问题的范围。 您还被告知 Windows 使用反斜杠作为其路径分隔符,而不是正斜杠(在基于 unix 的系统中使用)。我显然已经在 For 括号内为您进行了更正。 感谢@Compo,但更改斜杠并不能解决错误。 :) 我会尝试别的。 我从来没有说过它会@RealNoob,我只是纠正了你的错误。我无法帮助您解决我无法复制的问题。通过提供一个未在您的问题中使用的随机命令,并且没有任何上下文,您不能指望我帮助您解决它所展示的问题。 嗨@Compo 我应该用一整套命令更新问题吗?

以上是关于在批处理文件的 for 循环中设置随机变量值会产生错误的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB中for循环变量值不增加

for循环和while循环的区别?

for循环和while循环的区别?

shell脚本的使用---for循环

Shell脚本的循环:重复执行命令

java在循环语句的执行语句赋予变量值循环结束后会释放吗?