我正在试图转换文件(电影)在一个目录,一个接一个。 每个新的转换后的文件都需要分配一个新文件名 – 旧文件名带有新扩展名。
我已经尝试了下面的内容来读取源文件,剥离扩展名并分配一个新的:
@echo off setlocal DisableDelayedExpansion cd \target_dir for %%x in (*) do ( echo %%x set source=%%x echo Source #%source%# set target=%source:.mpg=% echo Target #%target%# transcode %source% %target%.mp4 )
不幸的是,这是行不通的。 正如输出显示,我甚至没有pipe理将当前文件复制到variables“源”:
E:\target_dir>..\test.bat movie1.mpg source ## target ## movie2.mpg source ## target ##
我search了一下,认为我find了正确的语法,但似乎并不是这样。 谢谢你的帮助!
jlahd显示一个正确的解决方案,而不复制文件名到一个变量。
但我想解释你目前的问题。
正如输出显示,我甚至没有管理将当前文件复制到变量“源”:
你找到了BBB(批处理初学者的bug),实际上你设置了这个变量,但是以后你没有访问这个内容。
这是批解析器处理代码块的一个效果,因为这些块将被解析,并且在代码执行之前将执行百分比扩展。
代码块是由&
, &&
或||
连接的括号内的代码或命令 。
为了避免这个问题,引入了延迟扩展。
那么你就可以使用!variable!
在运行时扩展一个变量。
setlocal EnableDelayedExpansion cd \target_dir for %%x in (*) do ( echo %%x set source=%%x echo Source #!source!# set target=!source:.mpg=! echo Target #!target!# transcode !source! !target!.mp4 )
这工作:
@echo off cd \target_dir for %%x in (*) do ( transcode "%%x" "%%~nx.mp4" )
请注意,您不能在标准环境变量上使用%%~n
语法 – 您需要直接访问for循环变量。
编辑:添加引号,使批处理文件的名称中也有空格。