web-dev-qa-db-ja.com

複数のファイル名の最後に「テキスト」を追加する

以下のコードを使用して、ファイル名の終わりにテキストを追加します。

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
5
user123

複数のファイル名の最後に「テキスト」を追加するにはどうすればよいですか。

以前: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.mp312345text.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

参考文献

  • Windows CMDコマンドラインのA-Zインデックス -Windows cmdラインに関連するすべてのものの優れたリファレンス。
  • for -複数のファイルに対して条件付きでコマンドを実行します。
  • parameters -コマンドライン引数(またはパラメーター)は、バッチスクリプトに渡される任意の値です。
3
DavidPostill

少なくとも元の名前と同じ長さの一連の?を使用して、ファイル名の最後(通常は拡張子の先頭である最初のドットの前)にテキストを追加できます。

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を使用する必要があります。

6
dbenham

この状況では、検索テキストに正規表現を含むPowerShell Rename-Itemコマンドが機能します。

Get-ChildItem -Filter '*mp3' -Recurse | Rename-Item -NewName {$_.name -replace '(.*)\.mp3','$1text.mp3'}

(.*)は、.が改行以外の任意の文字に一致し、*が0回以上一致する正規表現グループです。 \.は、mp3より前のピリオドと一致します。次に、置換テキストに$1を使用すると、最初のグループ(.*)で一致したテキストが挿入され、その後に、残りのテキストが続きます。
これは、可変長のファイル名、およびスペース、アンダースコア、その他の文字の組み合わせを含むファイル名で機能します。

1
wickstar

バッチファイルで行う必要がありますか? AdvancedRenamer は、ファイルまたはフォルダーの名前をバッチで変更するための無料で非常に用途の広いプログラムです。問題を簡単に解決します。

0
Joris Groosman