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在启用延迟扩展的情况下运行)
(如果您对或甚至对感兴趣,请按照链接进行操作)可能的副本