Windows 变量的行为不符合预期

Windows 变量的行为不符合预期,windows,batch-file,cmd,environment-variables,delayedvariableexpansion,Windows,Batch File,Cmd,Environment Variables,Delayedvariableexpansion,我一直在努力使这个批处理文件的语法正确,但我不明白为什么有些东西不起作用 变量i不会每次递增 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_mp4toann

我一直在努力使这个批处理文件的语法正确,但我不明白为什么有些东西不起作用

  • 变量
    i
    不会每次递增
  • 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
    

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

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

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

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

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

    setlocal EnableDelayedExpansion
    设置“var=hello”
    如果1==1(
    设置“var=world”
    回显%var%!var!
    )
    
    setlocal EnableDelayedExpansion
    对于(1,1,5)do中的/L%%i(
    回声%random%!random!
    )
    
    注:直线也被视为块:

    设置“var=old”
    设置“var=new”&回显%var%
    
    延迟扩展:

    setlocal EnableDelayedExpansion
    设置“var=old”
    设置“var=new”&echo!瓦尔!
    
    默认情况下,延迟扩展将在命令提示下关闭。如果您确实需要,您可以:

    cmd/V:ON/C“set”var=hello“&echo!var!”
    
    还有一种方法可以在不延迟扩展的情况下执行相同的操作(但是
    call
    需要花费一些时间,因此速度较慢,但是如果出于某种原因您不能/不想使用延迟扩展,则可以选择此方法):

    setlocal DISabledelayedexpansion
    对于(15)do中的/L%%i(
    调用回显%random%%%random%%
    )
    
    这两种方法也可用于显示:

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

    以下是在不同情况下使用类似数组的变量的集合:

    延迟扩展:

    setlocal ENableDelayedExpansion
    设置“num=4”
    设置“var[%num%]=HELLO”
    回声平原延迟:!变量[%num%]!
    对于(4 1 4)do中的/L%%i(
    延迟的回显:!var[%%i]!
    设置a=%%i
    使用变量%var[!a!]%调用延迟的回显
    )
    
    无延迟扩展:

    setlocal DISableDelayedExpansion
    设置“num=4”
    设置“var[%num%]=HELLO”
    调用回显普通调用:%%var[%num%]%%
    对于(4 1 4)do中的/L%%i(
    被调用的调用回显:%%var[%%i]%
    设置a=%%i
    使用变量%%var[%a%]%调用的的调用回显
    )
    
    注意
    setlocal
    在批处理文件之外不起作用,因此
    delayedexpansion
    仅适用于:

    • 在批处理文件中
    • 当cmd在启用延迟扩展的情况下启动时(
      cmd/V:ON
      )(默认情况下,cmd在启用延迟扩展的情况下运行)
    (如果您对或甚至对感兴趣,请按照链接进行操作)

    可能的副本