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

3
我想逐个将目录中的文件(电影)进行转换。每个新的转换文件都需要分配一个新的文件名-旧文件名与新扩展名。
我尝试了以下代码来读取源文件,去掉扩展名并指定一个新的扩展名:
@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 ##

我在谷歌上搜索了一下,认为我已经找到了正确的语法,但似乎并不是那样。感谢任何帮助!

2个回答

4
这是有效的代码:
@echo off
cd \target_dir
for %%x in (*) do (
    transcode "%%x" "%%~nx.mp4"
)

请注意,您不能在标准环境变量上使用%%~n语法 - 您需要直接访问for循环变量。 编辑:添加引号以使批处理适用于名称中带有空格的文件。

3

jlahd提供了一个正确的解决方案,而且没有将文件名复制到变量中。

但我想解释一下您当前的问题。

如输出所示,我甚至无法将当前文件复制到变量“source”中:

您发现了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
)

谢谢,这很有帮助。尽管如此,我还是会使用@jlahd的解决方案,因为“EnableDelayedExpansion”在包含!的文件名中会有问题 - 至少在echo中是这样,没有进一步测试。可能是因为 Windows 尝试使用此选项将!后面的部分解释为变量... - i3i5i7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接