「フォルダ内の .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 *.csv は report.txt → report.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
方法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: ドライラン(実際には変換せず確認のみ)
大量ファイルを変換する前に、どのファイルが変換されるかを確認できるドライランモードです。ren を echo 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)
Windows のファイルシステム(NTFS)はデフォルトで大文字小文字を区別しません。*.txt と指定すれば .TXT .Txt も対象になります。
rem Windows では *.txt が .TXT .Txt .txt を全て対象にする
for /r "%SRC%" %%F in (*.txt) do (
ren "%%~fF" "%%~nF.csv"
)
変換の逆を行います。.csv → .txt に戻す場合は NEW_EXT と OLD_EXT を入れ替えて再実行します。または 実践例B のバックアップパターンで事前にコピーを取っておくのが確実です。
rem .csv を .txt に戻す
for /r "%SRC%" %%F in (*.csv) do (
ren "%%~fF" "%%~nF.txt"
)
ループで件数をカウントするだけのドライラン確認が使えます。
@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
パスに除外フォルダ名が含まれるかチェックして 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
拡張子変換と同時にプレフィックス・サフィックスを追加するパターンです。
@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 で事前チェック |
ファイルの削除については ファイルを削除する方法完全ガイド を、ファイルの移動については ファイルを別フォルダに移動する方法完全ガイド を、特定の文字列を含むファイルのコピーは 特定の文字列を含むファイルをコピーする方法完全ガイド も合わせて参照してください。
