gpt4 book ai didi

windows - 变量的行为不符合预期

转载 作者:行者123 更新时间:2023-12-02 22:57:36 26 4
gpt4 key购买 nike

我一直在努力尝试使这个批处理文件的语法正确,但我无法弄清楚为什么有些东西不起作用。

  1. 每次执行此操作时,变量 i 都不会递增。
  2. strc 上的串联似乎没有串联。

这是我的代码:

set i=0
set "strc=concat:"

for %%f in (*.mp4) do (
set /a i+=1
set "str=intermediate%i%.ts"

set strc="%strc% %str%|"

ffmpeg -i "%%f" -c copy -bsf:v h264_mp4toannexb -f mpegts "%str%"
)

set strc="%strc:-1%"
ffmpeg -i "%strc%" -c copy -bsf:a aac_adtstoasc Output.mp4

最佳答案

你不是第一个陷入著名的“延迟扩张陷阱”的人(而且你也不会是最后一个)。

如果您想使用在同一 block 中更改的变量,则需要延迟扩展( block 是括号内的一系列命令()) .

延迟变量是用 !var! 引用的,而不是 %var%

原因是cmd解析代码的方式。一次解析完整的行或 block ,在解析时用它们的值替换普通变量。延迟变量在运行时评估。

要演示的两个简单批处理文件:

setlocal EnableDelayedExpansion
set "var=hello"
if 1==1 (
set "var=world"
echo %var% !var!
)
setlocal EnableDelayedExpansion
for /L %%i in (1,1,5) do (
echo %random% !random!
)

注意:一行也被视为一个 block :

set "var=old"
set "var=new" & echo %var%

延迟扩展:

setlocal EnableDelayedExpansion
set "var=old"
set "var=new" & echo !var!

延迟扩展默认在命令提示符处关闭。如果你确实需要它,你可以这样做:

cmd /V:ON /C "set "var=hello" & echo !var!"

还有一种方法可以在不延迟扩展的情况下执行相同的操作(但是 call 需要一些时间,因此速度较慢,但​​如果由于某种原因你不能/不想使用延迟扩展,这是一种替代方案):

setlocal DISabledelayedexpansion
for /L %%i in (1 1 5) do (
call echo %random% %%random%%
)

这两种方法也可以用来显示 array-like variables :

(这经常被问到“包含另一个变量的变量”或“嵌套变量”)

这里是在不同情况下使用此类数组变量的集合:

延迟扩展:

setlocal ENableDelayedExpansion
set "num=4"
set "var[%num%]=HELLO"
echo plain delayed: !var[%num%]!
for /L %%i in (4 1 4) do (
echo for delayed: !var[%%i]!
set a=%%i
call echo for delayed with variable: %%var[!a!]%%
)

无延迟扩展:

setlocal DISableDelayedExpansion
set "num=4"
set "var[%num%]=HELLO"
call echo plain called: %%var[%num%]%%
for /L %%i in (4 1 4) do (
call echo FOR called: %%var[%%i]%%
set a=%%i
call echo FOR called with variable: %%var[%a%]%%
)

注意:setlocal 在批处理文件之外没有任何效果,因此 delayedexpansion 仅有效:

  • 在批处理文件中
  • 在启用延迟扩展 (cmd/V:ON) 的情况下启动 cmd 时(默认情况下,cmd 在禁用启用延迟扩展的情况下运行)

(如果您对 technical background 甚至 advanced technical stuff 感兴趣,请点击链接)

关于windows - 变量的行为不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30282784/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com