以下のコードを使用して、ファイル名の終わりにテキストを追加します。
1.mp3
2.mp3
とする必要があります:
1text.mp3
2text.mp3
しかし、それは次のように変わりました:
1.mp3text
2.mp3text
コード:
@ECHO ON
FOR %%A IN ("C:\Users\user123\Desktop\mp3\*.mp2") DO (
CALL :RenameFiles "%%~A" "%%~NXA"
)
GOTO EOF
:RenameFiles
SET fname=%~2
SET renname=%fname=%
REN "%~1" "%renname%text%"
GOTO E
以前:1.mp3 2.mp3
後:1text.mp3 2text.mp3
バッチファイルに複数のエラーがあります。次に例を示します。
*.mp2
は*.mp3
である必要がありますgoto E
-ラベル:E
がありません。call
何もする必要はありません。rem @echo off
setlocal
setlocal enabledelayedexpansion
for %%a in ("C:\Users\user123\Desktop\mp3\*.mp3") do (
copy "%%a" "%%~dpnatext%%~xa"
del "%%a"
)
endlocal
ノート:
12345.mp3
は12345text.mp3
に名前が変更されます。cmd
シェルソリューションバッチファイルを使用する必要はありません。あなたはただ使うことができます:
cd C:\Users\user123\Desktop\mp3\
ren ?.mp3 ?text.mp3
または:
ren *.mp3 ?text.mp3
次のは機能しないことに注意してください。
ren *.mp3 *text.mp3
そのコマンドで1.mp3text.mp3
のようなファイル名を取得します。
例:
F:\test>dir *.mp3
Volume in drive F is Expansion
Volume Serial Number is 3656-BB63
Directory of F:\test
29/11/2015 12:52 0 1.mp3
29/11/2015 12:52 0 2.mp3
2 File(s) 0 bytes
0 Dir(s) 1,777,665,769,472 bytes free
F:\test>ren ?.mp3 ?text.mp3
F:\test>dir *.mp3
Volume in drive F is Expansion
Volume Serial Number is 3656-BB63
Directory of F:\test
29/11/2015 12:52 0 1text.mp3
29/11/2015 12:52 0 2text.mp3
2 File(s) 0 bytes
0 Dir(s) 1,777,665,769,472 bytes free
少なくとも元の名前と同じ長さの一連の?
を使用して、ファイル名の最後(通常は拡張子の先頭である最初のドットの前)にテキストを追加できます。
ren "C:\Users\user123\Desktop\mp3\*.mp3" ??????????????????????text.*
?
は、あらゆる文字に完全に一致して保持しますexcept.
。文字が足りない場合は、何にも一致しません。次にテキストが追加され、.*
はドットと名前の残りの部分を照合して保持します。
必要なファイルに一致するように、ソースファイルマスクを変更できます。ソースマスクは、名前変更マスクから完全に独立しています。
詳細は Windows RENAMEコマンドがワイルドカードをどのように解釈するか? を参照してください。
一部のファイルの名前に複数の.
が含まれている場合、単純なRENコマンドを単独で使用することはできません。 1つのオプションは、バッチスクリプトを使用することです。
@echo off
pushd "C:\Users\user123\Desktop\mp3\*.mp3"
for /f "delims= eol=:" %%F in ('dir /b /a-d *.mp3') do ren "%%F" "%%~nFtext%%~xF"
popd
単純なFORではなく、FOR/Fを使用することが重要です。 FOR/Fは、反復を開始する前にDIRコマンドの結果全体を収集しますが、単純なFORは、内部バッファーがいっぱいになった後に反復を開始します。これにより、同じファイルの名前を複数回変更するリスクが追加されます。
私はEOL=:
を使用して、ファイル名が;
で始まるというリモートの可能性を防ぎます。デフォルトのEOLは;
で、;
で始まる行は無視されます。ファイル名に:
を含めることはできないため、EOLオプションに使用しても安全な文字です。
DIR/Bを使用したFOR/Fの小さな欠点の1つは、パス情報が保持されないことです。そのため、最初にPUSHDを使用しました。 PUSHDを使用しない場合は、DIRコマンドにパス情報を含めることができますが、RENソースマスクにパスを含める必要もあります。次の1つのライナーは、コマンドラインで機能します(バッチスクリプトなし)。
for /f "delims= eol=:" %F in ('dir /b /a-d "C:\Users\user123\Desktop\mp3\*.mp3"') do @ren "C:\Users\user123\Desktop\mp3\%F" "%~nFtext%~xF"
別の方法は、FINDSTRコマンドを使用してファイルをリストすることです。これにより、パス情報が保持されます。
for /f "delims=" %F in ('findstr /m "^" "C:\Users\user123\Desktop\mp3\*.mp3"') do @ren "%F" "%~nFtext%~xF"
リストされた各ファイルはドライブ文字で始まるため、デフォルトのEOL=;
を使用しても安全です。
最後の1つの代替策-私の JREN.BAT正規表現の名前変更ユーティリティ を使用できます。これは、XP以降のWindowsマシンでネイティブに実行される純粋なスクリプト(ハイブリッドJScript /バッチ)です。
jren "(.*)(\.mp3)$" "$1text$2" /i /p "C:\Users\user123\Desktop\mp3"
JRENはバッチスクリプトであるため、別のバッチスクリプト内でコマンドを使用する場合は、CALL JRENを使用する必要があります。
この状況では、検索テキストに正規表現を含むPowerShell Rename-Itemコマンドが機能します。
Get-ChildItem -Filter '*mp3' -Recurse | Rename-Item -NewName {$_.name -replace '(.*)\.mp3','$1text.mp3'}
(.*)
は、.
が改行以外の任意の文字に一致し、*
が0回以上一致する正規表現グループです。 \.
は、mp3より前のピリオドと一致します。次に、置換テキストに$1
を使用すると、最初のグループ(.*)
で一致したテキストが挿入され、その後に、残りのテキストが続きます。
これは、可変長のファイル名、およびスペース、アンダースコア、その他の文字の組み合わせを含むファイル名で機能します。
バッチファイルで行う必要がありますか? AdvancedRenamer は、ファイルまたはフォルダーの名前をバッチで変更するための無料で非常に用途の広いプログラムです。問題を簡単に解決します。