Eri*_*ski 17 batch-file 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_mp4toannexb -f mpegts "%str%"
)
set strc="%strc:-1%"
ffmpeg -i "%strc%" -c copy -bsf:a aac_adtstoasc Output.mp4
Run Code Online (Sandbox Code Playgroud)
Ste*_*han 37
你不是第一个陷入着名的"延迟扩张陷阱"的人(你不会是最后一个).
您需要延迟扩展,如果你想使用一个变量,你在同一个块改变(块是括号内的一系列命令(和)).
引用延迟变量!var!而不是%var%.
原因是方式,cmd解析代码.一次解析完整的行或块,用解析时的值替换普通变量.延迟变量在运行时进行评估.
两个简单的批处理文件来演示:
setlocal EnableDelayedExpansion
set "var=hello"
if 1==1 (
set "var=world"
echo %var% !var!
)
Run Code Online (Sandbox Code Playgroud)
setlocal EnableDelayedExpansion
for /L %%i in (1,1,5) do (
echo %random% !random!
)
Run Code Online (Sandbox Code Playgroud)
注意:一条线也被视为一个块:
set "var=old"
set "var=new" & echo %var%
Run Code Online (Sandbox Code Playgroud)
延迟扩展:
setlocal EnableDelayedExpansion
set "var=old"
set "var=new" & echo !var!
Run Code Online (Sandbox Code Playgroud)
默认情况下,在命令提示符下关闭延迟扩展.如果你真的需要它,你可以这样做:
cmd /V:ON /C "set "var=hello" & echo !var!"
Run Code Online (Sandbox Code Playgroud)
还有一种方法可以做同样没有延迟扩展(但call花费一些时间,所以它更慢,但如果由于某种原因你不能/不想使用延迟扩展,它是一个替代):
setlocal DISabledelayedexpansion
for /L %%i in (1 1 5) do (
call echo %random% %%random%%
)
Run Code Online (Sandbox Code Playgroud)
这两种方法也可用于显示类似数组的变量:
(这通常被问为"包含另一个变量的变量"或"嵌套变量")
这是一个在不同情况下使用这种类似数组的变量的集合:
延迟扩展:
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!]%%
)
Run Code Online (Sandbox Code Playgroud)
没有延迟扩张:
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%]%%
)
Run Code Online (Sandbox Code Playgroud)
注:setlocal具有批处理文件中的外没有任何影响,所以推迟扩建工程只有:
-在批处理文件
-当CMD开始与延迟扩展启用(delayedexpansion)(默认情况下,CMD与延迟扩展运行DIS体健)