我正在尝试逐个转换目录中的文件(电影)。每个新转换的文件都需要分配一个新文件名 - 旧文件名具有新扩展名。
我已经尝试过以下内容来阅读源文件,剥离扩展并分配一个新文件:
@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
)
不幸的是,这不起作用。如输出所示,我甚至无法将当前文件复制到变量“source”中:
E:\target_dir>..\test.bat
movie1.mpg
source ##
target ##
movie2.mpg
source ##
target ##
我用Google搜索并认为我已经找到了正确的语法,但这似乎并非如此。谢谢你的帮助!
答案 0 :(得分:4)
这有效:
@echo off
cd \target_dir
for %%x in (*) do (
transcode "%%x" "%%~nx.mp4"
)
请注意,您无法在标准环境变量上使用%%~n
语法 - 您需要直接访问for循环变量。
编辑:添加引号以使批处理也适用于名称中包含空格的文件。
答案 1 :(得分:3)
jlahd显示正确的解决方案,而不将文件名复制到变量。
但我想解释你目前的问题。
如输出所示,我甚至无法复制当前文件 进入变量“source”:
您找到了BBB(批量初学者错误),实际上您设置了变量但后来无法访问该内容。
这是批处理解析器使用代码块的效果,因为这些块被解析,百分比扩展将在 代码执行之前完成。
代码块是括号内的代码或由&
,&&
或||
连接的命令。
为了避免这个问题,引入了延迟扩展
然后,您可以使用!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
)