首页 文章

批处理中的变量不符合预期

提问于
浏览
16

我一直在努力尝试在这个批处理文件中获得正确的语法,我不能为我的生活找出为什么有些东西不起作用 .

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

1 回答

  • 30

    你不是第一个陷入着名的“延迟扩张陷阱”的人(你不会是最后一个)

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

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

    原因就是这样, cmd 解析代码 . 一次解析完整的行或块,用解析时的值替换普通变量 . 延迟变量在运行时进行评估 .

    两个简单的批次演示:

    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!
    )
    

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

    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

    (这经常被问到"variable which contains another variable"或"nested variables"
    这是一个在不同情况下使用这种类似数组的变量的集合:

    with delayed expansion:

    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!]%%
    )
    

    without delayed expansion:

    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%]%%
    )
    

相关问题