【问题标题】:How to set and use filename string variables in cmd command line?如何在 cmd 命令行中设置和使用文件名字符串变量?
【发布时间】:2017-01-23 18:47:03
【问题描述】:

我正在尝试在 cmd 中运行 for 循环,如下所示:

for %f in (*.mp4) do (
    set outfile=%f:mp4=mp3%
    ffmpeg -i %f -vn -ar 44100 -ac 1 -b:a 32k -f mp3 %outfile%
)

该脚本应该抓取所有 *.mp4 文件,对其运行 ffmpeg 命令,然后将生成的文件命名为与 mp4 相同的文件,只是扩展名更改为 *.mp3。

它不起作用。输出的字面意思是%outfile%。如果我不得不猜测,outfile 变量的初始化或调用有问题。我还认为这可能是数据类型问题。 %f 可能是一个指针,而不是字符串,所以需要某种字符串提取或类型转换。

如何在 cmd 中设置和使用文件名作为字符串变量?

【问题讨论】:

  • 您需要为outfile启用和使用delayed expansion,因为您正在编写在单个代码块中读取此变量;否则,变量将扩展为解析整个块时所保存的值;或者,更简单的是,关注下面的MCND's advice...

标签: string cmd filenames


【解决方案1】:

最好的办法就是不去做。不要在变量中存储可以直接从for 可替换参数中检索到的内容。

for %f in (*.mp4) do ffmpeg -i "%f" -vn -ar 44100 -ac 1 -b:a 32k -f mp3 "%~nf.mp3"

for 命令可替换参数(在您的情况下为%f)允许使用一些修饰符(请参阅for /?)。 %~nf%f 引用的文件的名称,不带扩展名

但是,如果您唯一的选择是这样做,here 您可以找到一些解决问题的方法。

【讨论】:

  • 是的,似乎工作正常。所以这是一个数据类型问题?如果我将最后一部分更改为"%f.mp3",它将完全命名为filename.mp4.mp3。如果%f:mp4=mp3% 是最后一行,它不应该也可以工作吗?
  • @fredsbend for variables 仅在 for (block) 语句的范围内有效。
  • @fredsbend,子字符串替换语法不能与for变量引用一起使用,它只对“普通”环境变量有效...
  • @fredsbend,答案已更新。提供的链接应阐明问题的根源。
  • @MCND 是的,现在开始明白了。我对 DOS 和 cmd 很熟悉。五年前在大学里学过 UNIX 课程……不记得了。谢谢。
猜你喜欢
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 2011-05-14
  • 2022-10-05
  • 2015-11-27
  • 1970-01-01
相关资源
最近更新 更多