【bat】ファイルの拡張子を一括変換する方法完全ガイド|ren・for /r・サブフォルダ再帰・複数拡張子・ドライラン・実践パターンまで

「フォルダ内の .txt ファイルを全部 .csv に変えたい」「サブフォルダまで含めて拡張子を一括変換したい」——バッチファイルによる拡張子の一括変換は Windows 自動化の定番です。本記事では ren コマンドの基本 から for /r によるサブフォルダ再帰対応・複数拡張子の一括処理・ドライランモード・変換ログ記録・安全確認付き完全版まで体系的に解説します。

この記事で解決できること

  • フォルダ内の特定拡張子ファイルをすべて別の拡張子に変換する方法
  • サブフォルダまで再帰的に一括変換する方法(for /r
  • 複数の拡張子を同時に一括変換する方法
  • 変換前にドライラン(確認のみ)で安全チェックする方法
  • 変換ログを CSV ファイルに記録して運用する方法
  • ファイル名に数字・スペース・日本語が含まれる場合の注意点
スポンサーリンク

方法の比較

用途 方法 特徴
直下のファイルのみ ren *.txt *.csv 1行・シンプル・再帰なし
サブフォルダも再帰対応 for /r %%F in (*.txt) 全サブフォルダを再帰処理
複数拡張子を一括変換 拡張子リストをループ 複数種類を1スクリプトで処理
ドライラン(確認のみ) echo ren で確認 実際には変換せず一覧を表示
変換ログを記録 結果を CSV に出力 監査・ロールバック用途

方法1: ren コマンドで直下のファイルを一括変換

基本: 1行で拡張子を一括変換

rem カレントフォルダの .txt ファイルを .csv に一括変換
ren *.txt *.csv

ren(rename)コマンドはワイルドカードに対応しており、カレントフォルダ直下の拡張子を一括変換できます。
* 部分はファイル名ベースをそのまま引き継ぐため、ren *.txt *.csvreport.txtreport.csv のように変換します。

フォルダを指定して変換

@echo off
setlocal

set SRC=C:workfiles
set OLD_EXT=txt
set NEW_EXT=csv

rem フォルダを指定して拡張子を一括変換
ren "%SRC%*.%OLD_EXT%" "*.%NEW_EXT%"

if errorlevel 1 (
    echo [ERROR] 変換に失敗しました
) else (
    echo [OK] 変換完了
)

endlocal
ren の注意点
ren はカレントフォルダ直下のみ処理します。サブフォルダは対象外です。
サブフォルダまで処理したい場合は 方法2: for /r を使ってください。

方法2: for /r でサブフォルダも再帰的に一括変換

for /r はサブフォルダを再帰的に処理します。ren と組み合わせることで階層ごと一括変換できます。

サブフォルダ含む全ファイルを変換

@echo off
setlocal enabledelayedexpansion

set SRC=C:workfiles
set OLD_EXT=txt
set NEW_EXT=csv

set COUNT=0

for /r "%SRC%" %%F in (*.%OLD_EXT%) do (
    rem %%~nF = ファイル名(拡張子なし)
    ren "%%~fF" "%%~nF.%NEW_EXT%"
    if not errorlevel 1 (
        echo 変換: %%~fF → %%~nF.%NEW_EXT%
        set /a COUNT+=1
    ) else (
        echo [FAIL] %%~fF
    )
)

echo.
echo 完了: !COUNT! ファイルを変換しました
endlocal

変換の仕組み

変数修飾子 意味
%%~fF フルパス C:workfilesa.txt
%%~nF ファイル名のみ(拡張子なし) a
%%~xF 拡張子のみ(ドット含む) .txt
%%~dpF ドライブ+フォルダパス C:workfiles
%%~nxF ファイル名+拡張子 a.txt

方法3: 複数の拡張子を一括変換

拡張子のリストをループして、複数種類をまとめて変換するパターンです。

複数の元拡張子を同じ新拡張子に変換

@echo off
setlocal enabledelayedexpansion

set SRC=C:workfiles
set NEW_EXT=bak

rem 変換したい拡張子をスペース区切りで列挙
set EXT_LIST=txt log tmp

set TOTAL=0

for %%E in (%EXT_LIST%) do (
    echo --- 拡張子 .%%E を処理中 ---
    for /r "%SRC%" %%F in (*.%%E) do (
        ren "%%~fF" "%%~nF.%NEW_EXT%"
        if not errorlevel 1 (
            echo  変換: %%~nxF → %%~nF.%NEW_EXT%
            set /a TOTAL+=1
        )
    )
)

echo.
echo 完了: !TOTAL! ファイルを変換しました
endlocal

拡張子ごとに異なる変換先を指定

@echo off
setlocal enabledelayedexpansion

set SRC=C:workfiles

rem 「元拡張子:変換先拡張子」の対応表
set MAP=txt:csv log:bak htm:html

set TOTAL=0

for %%M in (%MAP%) do (
    rem %%M = "txt:csv" のような文字列
    for /f "tokens=1,2 delims=:" %%A in ("%%M") do (
        echo --- .%%A → .%%B ---
        for /r "%SRC%" %%F in (*.%%A) do (
            ren "%%~fF" "%%~nF.%%B"
            if not errorlevel 1 (
                echo  変換: %%~nxF → %%~nF.%%B
                set /a TOTAL+=1
            )
        )
    )
)

echo.
echo 完了: !TOTAL! ファイルを変換しました
endlocal

方法4: ドライラン(実際には変換せず確認のみ)

大量ファイルを変換する前に、どのファイルが変換されるかを確認できるドライランモードです。renecho ren に置き換えるだけで実現できます。

@echo off
setlocal enabledelayedexpansion

set SRC=C:workfiles
set OLD_EXT=txt
set NEW_EXT=csv

rem DRYRUN=1 にすると確認のみ(実際には変換しない)
set DRYRUN=1

set COUNT=0

for /r "%SRC%" %%F in (*.%OLD_EXT%) do (
    if "%DRYRUN%"=="1" (
        echo [DRYRUN] ren "%%~fF" → "%%~nF.%NEW_EXT%"
    ) else (
        ren "%%~fF" "%%~nF.%NEW_EXT%"
        if not errorlevel 1 (
            echo [OK] %%~fF → %%~nF.%NEW_EXT%
        )
    )
    set /a COUNT+=1
)

echo.
if "%DRYRUN%"=="1" (
    echo [DRYRUN] !COUNT! ファイルが変換対象です(実際には変換していません)
    echo 実行するには DRYRUN=0 に変更してください
) else (
    echo 完了: !COUNT! ファイルを変換しました
)

endlocal

方法5: 変換ログを CSV に記録する

@echo off
setlocal enabledelayedexpansion

set SRC=C:workfiles
set OLD_EXT=txt
set NEW_EXT=csv
set LOGFILE=%~dp0rename_log.csv

rem CSV ヘッダー(初回のみ)
if not exist "%LOGFILE%" (
    echo 日時,変換前ファイル名,変換後ファイル名,フォルダ,結果 > "%LOGFILE%"
)

set COUNT=0

for /r "%SRC%" %%F in (*.%OLD_EXT%) do (
    ren "%%~fF" "%%~nF.%NEW_EXT%"
    if not errorlevel 1 (
        set RESULT=OK
        set /a COUNT+=1
    ) else (
        set RESULT=FAIL
    )
    echo %DATE% %TIME%,%%~nxF,%%~nF.%NEW_EXT%,%%~dpF,!RESULT! >> "%LOGFILE%"
)

echo.
echo 完了: !COUNT! ファイルを変換しました
echo ログ: %LOGFILE%
endlocal

実践例A: .txt を .csv に一括変換(サブフォルダ含む)

業務でよく使う「テキストファイルを CSV に変換して取り込みたい」パターンの完成版です。

@echo off
setlocal enabledelayedexpansion

set SRC=C:workfiles

echo === 拡張子一括変換: .txt → .csv ===
echo 対象フォルダ: %SRC%
echo.

rem 対象ファイル数を事前に確認
set PREVIEW=0
for /r "%SRC%" %%F in (*.txt) do set /a PREVIEW+=1
echo 変換対象: !PREVIEW! ファイル

if !PREVIEW!==0 (
    echo 変換対象のファイルがありません。終了します
    exit /b 0
)

echo.
set /p CONFIRM=変換を実行しますか? [Y/N]: 

if /i not "%CONFIRM%"=="Y" (
    echo キャンセルしました
    exit /b 0
)

set COUNT=0
set FAIL=0

for /r "%SRC%" %%F in (*.txt) do (
    ren "%%~fF" "%%~nF.csv"
    if not errorlevel 1 (
        echo [OK] %%~fF → %%~nF.csv
        set /a COUNT+=1
    ) else (
        echo [FAIL] %%~fF
        set /a FAIL+=1
    )
)

echo.
echo === 完了 ===
echo 成功: !COUNT! ファイル
echo 失敗: !FAIL! ファイル
endlocal

実践例B: 変換前にバックアップしてから拡張子変換

変換後にロールバックできるよう、変換前にファイルをコピーしてからリネームするパターンです。

@echo off
setlocal enabledelayedexpansion

set SRC=C:workfiles
set BACKUP=C:workoutputackup_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
set OLD_EXT=txt
set NEW_EXT=csv

rem バックアップフォルダを作成
if not exist "%BACKUP%" mkdir "%BACKUP%"

set COUNT=0

for /r "%SRC%" %%F in (*.%OLD_EXT%) do (
    rem まず同名でバックアップ先にコピー
    copy "%%~fF" "%BACKUP%\%%~nxF" >nul
    if not errorlevel 1 (
        rem バックアップ成功後にリネーム
        ren "%%~fF" "%%~nF.%NEW_EXT%"
        if not errorlevel 1 (
            echo [OK] %%~nxF → %%~nF.%NEW_EXT%
            set /a COUNT+=1
        ) else (
            echo [FAIL] リネーム失敗: %%~nxF
        )
    ) else (
        echo [FAIL] バックアップ失敗(スキップ): %%~nxF
    )
)

echo.
echo 完了: !COUNT! ファイルを変換(バックアップ: %BACKUP%)
endlocal

実践例C: 引数で拡張子を指定して実行する汎用スクリプト

スクリプトを毎回編集しなくても、コマンドライン引数で拡張子を指定して使い回せる汎用バージョンです。

@echo off
setlocal enabledelayedexpansion

rem 使い方: rename_ext.bat [対象フォルダ] [変換前拡張子] [変換後拡張子]
rem 例: rename_ext.bat C:workfiles txt csv

if "%~3"=="" (
    echo 使い方: %~nx0 [フォルダ] [変換前拡張子] [変換後拡張子]
    echo 例: %~nx0 C:workfiles txt csv
    exit /b 1
)

set SRC=%~1
set OLD_EXT=%~2
set NEW_EXT=%~3

if not exist "%SRC%" (
    echo [ERROR] フォルダが見つかりません: %SRC%
    exit /b 1
)

echo 変換: .%OLD_EXT% → .%NEW_EXT%
echo フォルダ: %SRC%
echo.

set COUNT=0
set FAIL=0

for /r "%SRC%" %%F in (*.%OLD_EXT%) do (
    ren "%%~fF" "%%~nF.%NEW_EXT%"
    if not errorlevel 1 (
        echo [OK] %%~fF
        set /a COUNT+=1
    ) else (
        echo [FAIL] %%~fF
        set /a FAIL+=1
    )
)

echo.
echo 完了: 成功 !COUNT! 件 / 失敗 !FAIL! 件
endlocal

よくある落とし穴

落とし穴1: 同名の変換先ファイルが既に存在する

rem report.csv がすでに存在する場合、report.txt を .csv に変換しようとするとエラー
rem ren は上書き禁止なのでエラーになる

rem 解決策: 変換先ファイルの存在チェックを追加する
for /r "%SRC%" %%F in (*.txt) do (
    if exist "%%~dpF%%~nF.csv" (
        echo [SKIP] 既に存在します: %%~dpF%%~nF.csv
    ) else (
        ren "%%~fF" "%%~nF.csv"
        echo [OK] %%~nxF → %%~nF.csv
    )
)

落とし穴2: スペースを含むファイル名・フォルダ名でエラー

rem NG: クォートなしだとスペースでパスが分割される
for /r %SRC% %%F in (*.txt) do ren %%F %%~nF.csv

rem OK: フルパスとファイル名をダブルクォートで囲む
for /r "%SRC%" %%F in (*.txt) do (
    ren "%%~fF" "%%~nF.csv"
)

落とし穴3: ren はフォルダをまたいで移動できない

rem NG: ren はファイル名のみ変更。別フォルダへの移動はできない
ren "C:srcfile.txt" "C:dstfile.csv"  ← エラー

rem OK: 別フォルダへ移動するには copy + del または move を使う
copy "C:srcfile.txt" "C:dstfile.csv"
del "C:srcfile.txt"

落とし穴4: .と.. (カレント・親ディレクトリ)が変換対象になる場合

rem for /r でファイルを処理する場合、属性チェックを入れると安全
for /r "%SRC%" %%F in (*.txt) do (
    rem %%~aF の最初の文字が "-" ならファイル(d= ディレクトリ)
    if /i not "%%~aF" == "" (
        ren "%%~fF" "%%~nF.csv"
    )
)

落とし穴5: 拡張子なしのファイルが対象になる

rem "*.txt" に拡張子なしのファイルは含まれないので通常は問題ない
rem ただし "for /r %%F in (*)" のように全ファイル指定する場合は注意

rem 拡張子チェックを入れると安全
for /r "%SRC%" %%F in (*) do (
    if /i "%%~xF"==".txt" (
        ren "%%~fF" "%%~nF.csv"
    )
)

よくある質問(FAQ)

Q 大文字の拡張子(.TXT)と小文字(.txt)の両方を変換したい
A

Windows のファイルシステム(NTFS)はデフォルトで大文字小文字を区別しません。*.txt と指定すれば .TXT .Txt も対象になります。

rem Windows では *.txt が .TXT .Txt .txt を全て対象にする
for /r "%SRC%" %%F in (*.txt) do (
    ren "%%~fF" "%%~nF.csv"
)
Q 変換したファイルをもとに戻したい(ロールバック)
A

変換の逆を行います。.csv.txt に戻す場合は NEW_EXT と OLD_EXT を入れ替えて再実行します。または 実践例B のバックアップパターンで事前にコピーを取っておくのが確実です。

rem .csv を .txt に戻す
for /r "%SRC%" %%F in (*.csv) do (
    ren "%%~fF" "%%~nF.txt"
)
Q 変換前に対象ファイルの件数だけ確認したい
A

ループで件数をカウントするだけのドライラン確認が使えます。

@echo off
setlocal enabledelayedexpansion

set SRC=C:workfiles
set COUNT=0

for /r "%SRC%" %%F in (*.txt) do (
    echo 対象: %%~fF
    set /a COUNT+=1
)

echo.
echo 変換対象: !COUNT! ファイル
endlocal
Q 特定のサブフォルダだけ除外して変換したい
A

パスに除外フォルダ名が含まれるかチェックして goto でスキップします。

@echo off
setlocal enabledelayedexpansion

set SRC=C:workfiles
set EXCLUDE=archive

for /r "%SRC%" %%F in (*.txt) do (
    rem フォルダパスに除外キーワードが含まれていたらスキップ
    echo %%~dpF | findstr /i /c:"%EXCLUDE%" >nul
    if not errorlevel 1 (
        echo [SKIP] %%~fF
    ) else (
        ren "%%~fF" "%%~nF.csv"
        echo [OK] %%~nxF → %%~nF.csv
    )
)

endlocal
Q ファイル名の一部を変えながら拡張子も変換したい
A

拡張子変換と同時にプレフィックス・サフィックスを追加するパターンです。

@echo off
setlocal enabledelayedexpansion

set SRC=C:workfiles

rem "report_" プレフィックスを付けて .txt → .csv に変換
for /r "%SRC%" %%F in (*.txt) do (
    ren "%%~fF" "report_%%~nF.csv"
    echo [OK] %%~nxF → report_%%~nF.csv
)

endlocal

まとめ

目的 推奨方法
直下のファイルを変換 ren *.txt *.csv(1行でOK)
サブフォルダも含めて変換 for /r %%F in (*.txt) do ren
複数の拡張子を一括変換 拡張子リストを for %%E in (...) でループ
変換前に対象確認(ドライラン) echo ren でシミュレーション
安全に変換(バックアップ付き) コピー後にリネーム
変換ログを記録 CSV ファイルに日時・結果を追記
同名ファイルが存在してもスキップ if not exist で事前チェック

ファイルの削除については ファイルを削除する方法完全ガイド を、ファイルの移動については ファイルを別フォルダに移動する方法完全ガイド を、特定の文字列を含むファイルのコピーは 特定の文字列を含むファイルをコピーする方法完全ガイド も合わせて参照してください。