Windows批处理脚本 - 将文件名读入变量

时间:2015-01-07 11:23:34

标签: windows variables batch-file

我正在尝试逐个转换目录中的文件(电影)。每个新转换的文件都需要分配一个新文件名 - 旧文件名具有新扩展名。

我已经尝试过以下内容来阅读源文件,剥离扩展并分配一个新文件:

@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搜索并认为我已经找到了正确的语法,但这似乎并非如此。谢谢你的帮助!

2 个答案:

答案 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
)