2

我在 c:\files 中有数百个 *.mp3 文件。那里有所有可以想象的文件名,例如

  • milad.mp3(表现良好)
  • 嘿 you.mp3(文件名中的空格)
  • systemofadown.mp3(长文件名)
  • howdy(1).mp3(文件名中的括号)

以及最后三个条件的任意组合。我想将文件重命名为 001-test.mp3, 002-mp3, ... 哪个文件取哪个名称都没有关系。已经编写了一个批处理文件来进行重命名。这是我的代码(添加了行号):

01  rem @echo off
02  cls
03  set _number=%1
04  lfnfor on
05
06  :F1TO10
07  IF NOT EXIST *.mp3. goto end
08  if %_number% gtr 9 goto F10TO100
09  for /f %%a IN ('dir /b *.mp3') do rename %%~na.mp3 00%_number%-test.mp4
10  set /a _number +=1
11  goto F1TO10
12
13  :F10TO100
14  IF NOT EXIST *.mp3. goto end
15  if %_number% gtr 99 goto F100TO1000
16  for /f %%a IN ('dir /b *.mp3') do rename %%~na.mp3 0%_number%-test.mp4
17  set /a _number +=1
18  goto F10TO100
19
20  :F100TO1000
21  IF NOT EXIST *.mp3. goto end
22  if %_number% gtr 999 goto end
23  for /f %%a IN ('dir /b *.mp3') do rename %%~na.mp3 %_number%-test.mp4
24  set /a _number +=1
25  goto F100TO1000
26
27  :end
28  for /f %%a IN ('dir /b *.mp4') do rename %%~na.mp4 %%~na.mp3
29  echo Done

此代码适用于表现良好的文件名(即没有空格、没有括号、长度不超过 8 个字符)。但是,如果我什至有一个文件名不正确的文件,脚本就会中断(它会无限循环,直到我用 Ctrl-C 停止它)。

问题显然是文件名问题。如何解决这个问题?有任何想法吗?我将不胜感激任何帮助。

4

8 回答 8

2

尝试%%~fsa.mp3代替%%~na.mp3.

如最后给出的http://www.ss64.org/viewtopic.php?id=93

或在长名称中添加引号..

于 2009-03-26T05:38:36.197 回答
1

用一个漂亮的简单 ruby​​ 脚本替换它怎么样?

Dir["*.mp3"].each_with_index{ |filename,index|
  File.rename filename, "Test-#{index}.mp3"
}
于 2009-03-26T05:11:31.160 回答
0

我真的认为你在这条路上走得很艰难。我经常做这种操作,并使用BRU做那种事情(有无数其他替代品可用)——它体积小、便携,工作出色。

看不出浪费时间为此编写新的批处理文件的一个很好的理由。

于 2009-03-26T05:10:14.503 回答
0

根本问题是空格用作单词分隔符,即“foo bar.txt”被认为是两个文件。

您需要以某种方式正确地转义 cmd.exe 的参数,因此您需要检查文档......对您来说不幸的是,世界其他地方已经开始前进,并且更喜欢使用任意数量的替代 shell(见鬼,甚至 bash在 cygwin 上),或者按照 Chris 的建议,改用另一种语言。

Ruby、python 和 perl 是不错的选择。

于 2009-03-26T05:19:43.607 回答
0

如果您不介意使用 Windows 脚本文件,则可以非常轻松地执行此功能,并且很可能更易于阅读/更新。

var path = "c:\\files";
var io = new ActiveXObject("Scripting.FileSystemObject");

Enumerator.prototype.each = function(f, c) {
  for (var i = 0; !this.atEnd(); this.moveNext()) {
    if (f.call(c, this.item(), i++, this)===false) break;
  }
  return this;
};

function fixedLength(n) {
  return (n < 100 ? "0" : "") + (n < 10 ? "0" : "") + n;
};

var results = [];
new Enumerator(io.GetFolder(path).Files).each(function(file, index) {
  var oldName = file.Name, newName = fixedLength(index+1) + ".mp3";
  if (/\.mp3$/i.test(oldName)) {
    // mp3 extension
    file.Name = newName;
    results.push(newName + " <-- " + oldName);
  }
});

WScript.Echo(results.join("\n"));

只需保存为 renameMP3s.js 或您想要的任何.js 并双击。

于 2009-03-26T05:23:12.147 回答
0

Windows Vista 支持批量重命名。只需选择资源管理器窗口中的所有项目,然后按 F2。输入您想要的文件名(在本例中为“test”),然后按 Enter。Bam,每个人都重新命名。

这至少会为您标准化。然后,您可以编写一个脚本,在所有内容周围加上引号,例如“%1”、“%%~na.mp3”等,然后就完成了。

于 2009-03-26T07:35:32.750 回答
0

您是否尝试在找到的文件名周围加上引号for

rename "%%~na.mp3"而不是rename %%~na.mp3

于 2009-03-26T11:23:38.380 回答
0

首先感谢通过解答提供帮助的朋友。但没有一个是我要找的。实际上,我使用Spire提供的帮助找到了一个完美的工作脚本,作为对这个问题的回答。

这是最终代码:(这次不需要行号)

rem @echo off
cls
set _number=%1

:F1TO10
IF NOT EXIST *.mp3. goto end
if %_number% gtr 9 goto F10TO100
for /f "usebackq delims=" %%x in (`dir /b *.mp3`) do rename %%~nsx.mp3 00%_number%-test.mp9
set /a _number +=1
goto F1TO10

:F10TO100
IF NOT EXIST *.mp3. goto end
if %_number% gtr 99 goto F100TO1000
for /f "usebackq delims=" %%x in (`dir /b *.mp3`) do rename %%~nsx.mp3 0%_number%-test.mp9
set /a _number +=1
goto F10TO100

:F100TO1000
IF NOT EXIST *.mp3. goto end
if %_number% gtr 999 goto end
for /f "usebackq delims=" %%x in (`dir /b *.mp3`) do rename %%~nsx.mp3 %_number%-test.mp9
set /a _number +=1
goto F100TO1000

:end
for /f %%a IN ('dir /b *.mp9') do rename %%~na.mp9 %%~na.mp3
echo Done.
于 2009-03-31T05:23:37.677 回答