我在c:\ files中有几百个* .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停止它。)
问题显然是文件名问题。怎么解决这个问题?有任何想法吗?我非常感谢任何帮助。
答案 0 :(得分:2)
答案 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.