批处理程序脚本问题打破了带空格的文件名

时间:2009-10-08 13:55:44

标签: batch-file mp3

以下是一个批处理脚本,它将mp3splt(一个将mp3 http://mp3splt.sourceforge.net/mp3splt_page/home.php分割成的程序)调用为5分钟长的分区。

for /f %%a IN ('dir /b *.mp3') do call c:\PROGRA~1\mp3splt\mp3splt -t 5.0 -o output\@f+-+@n+-+@t  %%a

当mp3文件包含空格时会中断。任何人都可以提出解决方法吗?

2 个答案:

答案 0 :(得分:2)

for %%a IN (*.mp3) do (
    call c:\PROGRA~1\mp3splt\mp3splt -t 5.0 -o output\@f+-+@n+-+@t "%%a"
)

其他人在这里引用变量无疑是正确的。这需要它才能正常工作。但它也只是解决方案的一半。

你的问题是dir /b吐出文本行,每行包含一个文件名,如下所示:

foo bar.mp3
baz gak.mp3
track01.mp3
...
另一方面,

for /f用于读取文件或其他内容(本例中为dir输出)逐行... 它也进行了标记化。这意味着它将可配置位置的字符串拆分为单个标记。

  

默认情况下,/ F传递第一个空白   每个行的每一行分开的标记   文件。空白行被跳过。您   可以覆盖默认解析   通过指定可选的行为   “选项”参数。这是引用的   包含一个或多个的字符串   用于指定不同解析的关键字   选项。 - help for

因此,您只能在文件名的第一个空格之前获取该部分。您可以使用

解决这个问题
for /f "delims=" in ...

指定标记化应该没有分隔符,基本上每次都给你完整的行。但更好的方法实际上是我在开始时概述的那个只使用常规for来迭代文件的方法。没有惊喜,文件名中有空格,这实际上让你的意图更加清晰。

我经常感到惊讶的是,为什么人们倾向于选择一个错综复杂的错误解决方案,而不是一个简单,清晰和正确的解决方案。

答案 1 :(得分:1)

您可以引用包含文件名的变量:

"%%a"