处理文件名中的特殊字符时批量重命名问题

时间:2009-03-26 04:35:58

标签: windows batch-file file-rename

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

  • milad.mp3(表现良好)
  • 嘿you.mp3(文件名中的空格)
  • systemofadown.mp3(长文件名)
  • 你好(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停止它。)

问题显然是文件名问题。怎么解决这个问题?有任何想法吗?我非常感谢任何帮助。

8 个答案:

答案 0 :(得分:2)

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

http://www.ss64.org/viewtopic.php?id=93

结尾处给出

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

答案 1 :(得分:1)

如何用漂亮的简单ruby脚本替换它?

Dir["*.mp3"].each_with_index{ |filename,index|
  File.rename filename, "Test-#{index}.mp3"
}

答案 2 :(得分:0)

我真的认为你正在采取这条艰难的路线。我经常做这种操作,并使用BRU来做这种事情(有很多其他替代品可供使用) - 它小巧,便携,可以很好地完成它的工作。

无法看到为此编写新批处理文件而浪费时间的一个充分理由。

答案 3 :(得分:0)

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

你需要以某种方式正确地为cmd.exe转义参数,所以你需要检查文档...不幸的是,世界其他地方已经继续前进,并且更喜欢使用任意数量的替代shell(哎呀) ,甚至对cygwin进行抨击),或者克里斯建议,改为使用另一种语言。

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

答案 4 :(得分: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或whatever.js,然后双击。

答案 5 :(得分:0)

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

这至少会为你正常化。然后你可以编写一个脚本,在所有内容中加上引号,例如: “%1”,“%% ~na.mp3”等等,你已经完成了。

答案 6 :(得分:0)

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

rename "%%~na.mp3"代替rename %%~na.mp3

答案 7 :(得分:0)

首先,我要感谢通过答案提供帮助的朋友们。但没有一个是我想要的。实际上,我使用Spire提供的帮助作为this question的答案,找到了一个完美无缺的工作脚本。

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

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.