2009-03-26 8 views
2

私は数百の* .mp3ファイルをc:\ filesに持っています。ファイル名に特殊文字を扱うときのバッチリネームの問題

  • milad.mp3(いいな振舞い)
  • ちょっとyou.mp3(ファイル名にスペース)
  • systemofadown.mp3(長いファイル名)のような存在のすべての想像のファイル名があります
  • ハウディ(1) .mp3(ファイル名のかっこ)

と最後の3つの条件の任意の組み合わせ。 ファイルの名前を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文字の長より、すなわちスペースなし、なし括弧)のために正常に動作します。しかし、ファイル名が1つでも悪いファイルがあったとしても、スクリプトは中断します(Ctrl-Cで止めるまで無限にループします)。

問題は明らかにファイル名の問題です。どのようにこれを修正することができますか?何か案は?私は大いに助けていただければ幸いです。

答えて

0

まず最初に、回答を得た友人に感謝します。しかし、私が探していたものはありませんでした。実際には、this questionへの回答として投稿された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. 
0

私は本当にあなたがこの1つでハードなルートをとっていると思います。私はそのような種類の操作を頻繁に行い、そのような種類のものにはBRUを使用しています(他にも数多くの選択肢があります)。

新しいバッチファイルを書き込むと時間を無駄にする理由が見当たりません。

1

素敵なシンプルなルビースクリプトで置き換えるのはどうですか?

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

根本的な問題は、スペースが単語の区切りとして使用されていること、すなわち、「FOOのbar.txt」は、2つのファイルであると考えられています。

cmd.exeの引数をどうにかしてエスケープする必要があるので、ドキュメントをチェックする必要があります...残念なことに、残りの世界は移動していて、任意の数の代替シェルcygwinのbashでさえ)、あるいはChrisが提案したように、代わりに別の言語を使うことができます。

Ruby、Python、Perlは良い選択です。

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として保存してダブルクリックしてください。

+0

良さ、私のああ... Windowsのスクリプトファイルを使用するように決して私を思い出させるん!私はこれを「とても簡単に」と呼ぶつもりはない。 – Arafangion

+0

ありがとうございます。私はこれを使用しようとしましたが、Windowsのスクリプティングホストを起動できませんでした( 'ファイル拡張子 ".js"のスクリプトエンジンはありません)' –

+0

私はヘルパーユーティリティーの機能のほとんどを持っているので、機能は1つの時間だけ使用されている場合は、実際にはさらに小さくなる可能性がありますが、むしろいくつかのコードを表示することができます。 –

2

%%~na.mp3の代わりに%%~fsa.mp3を試してください。 http://www.ss64.org/viewtopic.php?id=93

で終わりに与えられたかLONGNAMEに引用符を追加すると

..

+0

文書化のためにどのようなリソースを使用しましたか(これはこれまで唯一の関連する回答であるため、これを変更しました) – Arafangion

+0

私はこれを見ることができるURLを提供しました... – lakshmanaraj

+0

ファイル名に空白が含まれている場合は、引用符で囲む必要があります。そうでなければ、ジャンクが発生します:) – Joey

0

Windows Vistaは、バルク名前変更をサポートしています。エクスプローラウィンドウですべての項目を選択し、F2キーを押すだけです。必要なファイル名(この場合は "test")を入力し、Enterキーを押します。 Bam、誰もが名前を変えた。

これは少なくとも正規化します。次に、すべての箇所に引用符を付けるスクリプトを書くことができます。 "%1"、 "%%〜na.mp3"など、あなたは完了です。

+0

提案してくれてありがとうございますが、それはxp上で動作し、xpの名前はfile.ext、file(1).ext、file(2).ext、...と変わります –

0

forのファイル名を引用符で囲んでみましたか?

rename "%%~na.mp3"rename %%~na.mp3の代わりに?

関連する問題