变量没有按预期表现

问题描述 投票:0回答:1

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

  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
windows batch-file cmd environment-variables delayedvariableexpansion
1个回答
58
投票

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

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

(
)
)。

延迟变量用

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

这两种方法也可以用来显示类数组变量

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

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

延迟扩张:

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
只起作用:

  • 在批处理文件中
  • When the cmd was started with delayed expansion enabled (
    cmd /V:ON
    )(默认情况下,cmd runs with delayed expansion disabled)

(如果您对技术背景甚至高级技术知识感兴趣,请点击链接)

© www.soinside.com 2019 - 2024. All rights reserved.