バッチファイルでフォルダを削除するには rmdir(別名 rd)コマンドを使います。単純な1フォルダの削除から、中身だけ残す・存在確認してから削除・読み取り専用ファイルへの対処・古いフォルダの自動削除・世代管理まで、実務で使えるパターンを体系的に解説します。
rmdir /S /Q で削除したフォルダと中身はゴミ箱に入らず即座に完全削除されます。復元ツールがない限り戻せません。本番環境で実行する前に必ずドライラン(削除対象の確認)を行ってください。rmdir /S /Qの基本と主要オプション- 空のフォルダだけを削除する方法
- フォルダの中身だけ削除してフォルダ本体を残す方法
- 存在確認(if exist)してから安全に削除する方法
- 読み取り専用ファイルが含まれる場合の対処(attrib + rmdir)
- ワイルドカード・forfiles で古いフォルダを一括削除する方法
- PowerShell でゴミ箱に移動する方法
- 実践例3本(ログ世代管理・一時フォルダ清掃・デプロイ前旧バージョン削除)
1. rmdir コマンドの基本構文とオプション
rmdir [/S] [/Q] フォルダパス
| オプション | 意味 | 使いどき |
|---|---|---|
| (なし) | 空のフォルダのみ削除(中身があるとエラー) | 空フォルダ確認しながら削除したいとき |
/S |
サブフォルダ・ファイルを含めて再帰削除 | フォルダをまるごと削除するとき(必須) |
/Q |
確認メッセージを表示しない(Quiet) | 自動化バッチ(ほぼ常に指定) |
/S /Q |
確認なしで再帰削除(最もよく使う組み合わせ) | 自動化バッチの標準形 |
@echo off :: 基本形:フォルダをまるごと削除 rmdir /S /Q "C:\work\temp_folder" :: rd は rmdir の別名(まったく同じ動作) rd /S /Q "C:\work\temp_folder" :: /Q なし → 「C:\work\temp_folder、よろしいですか (Y/N)?」と聞かれる rmdir /S "C:\work\temp_folder"
rmdir と rd は完全なエイリアスです。どちらを使っても動作は同一です。バッチファイルでは短い rd を使うチームも多いですが、可読性の観点から rmdir を推奨します。2. 存在確認してから安全に削除する
存在しないフォルダを削除しようとするとエラーになります。if exist で事前にチェックするのが安全です。
@echo off
setlocal
set TARGET=C:\work\old_data
:: フォルダの存在確認(パス末尾に \ を付けるとフォルダのみ判定)
if exist "%TARGET%\" (
echo [INFO] 削除します: %TARGET%
rmdir /S /Q "%TARGET%"
if %errorlevel% equ 0 (
echo [OK] 削除完了
) else (
echo [ERROR] 削除に失敗しました
exit /b 1
)
) else (
echo [INFO] フォルダが見つかりません: %TARGET%
)
if exist "%PATH%" はファイルとフォルダの両方にマッチしますが、if exist "%PATH%\"(末尾にバックスラッシュ)にするとフォルダのみを判定します。誤ってファイルを対象にしてしまうミスを防げます。存在確認の詳細は IF EXISTでファイル・フォルダの存在確認をする方法 も参照してください。
3. 空のフォルダだけを削除する
/S オプションなしで rmdir を使うと、空フォルダのみを削除できます(中身があればエラーになる)。これを利用して「中身のないフォルダだけ消したい」用途に使えます。
@echo off
setlocal enabledelayedexpansion
:: /S なし → 空フォルダのみ削除(中身があればエラー)
rmdir "C:\work\empty_folder"
:: 複数の空フォルダをループで削除
for /d %%D in ("C:\work\logs\*") do (
rmdir "%%D" >nul 2>&1
if !errorlevel! equ 0 (
echo [DELETED] %%~nxD
)
)
echo 空フォルダの削除が完了しました
@echo off
:: サブフォルダも含めて再帰的に空フォルダを削除(for /r + rmdir)
:: ※ 深いフォルダから順に削除するため複数回実行が必要な場合あり
for /f "delims=" %%D in ('dir /s /b /ad "C:\work" ^| sort /r') do (
rmdir "%%D" >nul 2>&1
if not errorlevel 1 echo [DELETED] %%D
)
4. フォルダの中身だけ削除してフォルダ本体は残す
「フォルダは残しつつ中の全ファイル・サブフォルダを消したい」場合は、del /s /q(ファイル削除)と for /d(サブフォルダ削除)を組み合わせます。
@echo off
setlocal
set TARGET=C:\work\output
if not exist "%TARGET%\" (
echo [ERROR] フォルダが見つかりません: %TARGET%
exit /b 1
)
:: ファイルをすべて削除(サブフォルダ内含む)
del /s /q "%TARGET%\*" >nul 2>&1
:: サブフォルダをすべて削除(フォルダ本体は残る)
for /d %%D in ("%TARGET%\*") do (
rmdir /S /Q "%%D"
)
echo [OK] %TARGET% の中身を削除しました(フォルダ本体は維持)
del /s /q は隠し属性(Hidden)のファイルを削除しません。隠しファイルも含めて削除するには del /s /q /a "%TARGET%\*"(/a で全属性対象)を使ってください。5. 読み取り専用ファイルが含まれる場合の対処
読み取り専用(Read-Only)属性のファイルが含まれるフォルダを rmdir /S /Q で削除しようとすると「アクセスが拒否されました」エラーが発生することがあります。attrib コマンドで属性を解除してから削除します。
@echo off
setlocal
set TARGET=C:\work\readonly_folder
if not exist "%TARGET%\" (
echo [ERROR] フォルダが見つかりません
exit /b 1
)
:: 読み取り専用・隠し・システム属性をすべて解除してから削除
attrib -r -h -s /s /d "%TARGET%\*"
:: 属性解除後に削除
rmdir /S /Q "%TARGET%"
if %errorlevel% equ 0 (
echo [OK] 削除完了
) else (
echo [ERROR] 削除失敗(プロセスがファイルを使用中の可能性があります)
exit /b 1
)
| attrib オプション | 意味 |
|---|---|
-r |
読み取り専用属性を解除 |
-h |
隠しファイル属性を解除 |
-s |
システムファイル属性を解除 |
/s |
サブフォルダ内のファイルにも適用 |
/d |
フォルダ自体にも適用 |
6. ワイルドカードで複数フォルダを一括削除する
rmdir はワイルドカードを直接受け付けません。for /d ループで一致するフォルダを列挙してから削除します。
@echo off
setlocal
:: "tmp_" で始まるフォルダをすべて削除
for /d %%D in ("C:\work\tmp_*") do (
echo [DELETE] %%~nxD
rmdir /S /Q "%%D"
)
:: サブフォルダ内も含めて再帰的に "cache" フォルダを削除
for /r "C:\app" /d %%D in (cache) do (
if exist "%%D\" (
echo [DELETE] %%D
rmdir /S /Q "%%D"
)
)
6-1. 名前パターンにマッチするフォルダをドライランで確認してから削除
@echo off
setlocal
set DRY_RUN=1
:: 引数 --execute が渡されたら実際に削除
if /i "%~1"=="--execute" set DRY_RUN=0
echo === 削除対象フォルダ ===
set DELETE_COUNT=0
for /d %%D in ("C:\deploy\release_*") do (
echo %%D
set /a DELETE_COUNT+=1
)
echo 合計: %DELETE_COUNT% フォルダ
if "%DRY_RUN%"=="1" (
echo.
echo [DRY-RUN] 実際には削除しません。--execute を付けて実行すると削除されます。
exit /b 0
)
:: 実際に削除
for /d %%D in ("C:\deploy\release_*") do (
rmdir /S /Q "%%D"
echo [DELETED] %%~nxD
)
echo 削除完了
7. forfiles で N 日以上前のフォルダを自動削除する
forfiles コマンドの /D オプションで更新日時を基準にフォルダをフィルタして削除できます。ログフォルダの世代管理に最適です。
@echo off setlocal :: 30日以上前に更新されたフォルダを削除 forfiles /P "C:\logs\archive" /D -30 /C "cmd /c if @isdir==TRUE rd /S /Q @path" :: エラー(対象なし)を無視したい場合 forfiles /P "C:\logs\archive" /D -30 /C "cmd /c if @isdir==TRUE rd /S /Q @path" 2>nul :: 削除対象を先に確認する(ドライラン) echo === 削除対象(30日以上前) === forfiles /P "C:\logs\archive" /D -30 /C "cmd /c if @isdir==TRUE echo @fname @fdate"
| forfiles オプション | 意味 |
|---|---|
/P パス |
対象フォルダを指定 |
/D -N |
N 日以上前に更新されたもの |
/D +N |
N 日以内に更新されたもの |
/C "コマンド" |
各ファイル/フォルダに対して実行するコマンド |
@isdir |
フォルダなら TRUE、ファイルなら FALSE |
@path |
フルパス(ダブルクォート付き) |
@fname |
ファイル名/フォルダ名のみ |
@fdate |
最終更新日付 |
forfiles を使った古いファイルの自動削除は 指定期間以前に更新されたファイルを自動削除する方法完全ガイド も参照してください。
8. ゴミ箱に移動する方法(PowerShell)
rmdir は完全削除(ゴミ箱なし)ですが、PowerShell を使えばフォルダをゴミ箱に移動できます。誤削除リスクが高い操作で安全網として使えます。
@echo off
:: PowerShell でゴミ箱に移動(復元可能)
set TARGET=C:\work\old_project
powershell -Command ^^
"$shell = New-Object -ComObject Shell.Application;" ^^
"$folder = $shell.Namespace(0);" ^^
"$item = Get-Item '%TARGET%';" ^^
"$folder.MoveHere($item.FullName, 0x40)"
echo [OK] ゴミ箱に移動しました: %TARGET%
ネットワークドライブ上のフォルダはゴミ箱を経由せず完全削除されます。また、ゴミ箱の容量を超えるフォルダはエラーになります。重要データの削除前は必ず別の場所にバックアップを取ってください。
9. 実践例3本
実践例1:ログフォルダの世代管理(最新N世代だけ残して古いものを削除)
@echo off
setlocal enabledelayedexpansion
:: 日付付きバックアップフォルダを RETAIN_COUNT 世代だけ残す
:: フォルダ名形式: backup_20250317, backup_20250316, ...
set BACKUP_DIR=D:\backups
set RETAIN_COUNT=7
:: フォルダ数をカウント
set TOTAL=0
for /d %%D in ("%BACKUP_DIR%\backup_*") do set /a TOTAL+=1
echo バックアップフォルダ数: %TOTAL%
if %TOTAL% leq %RETAIN_COUNT% (
echo 保持数(%RETAIN_COUNT%)以下のため削除不要
exit /b 0
)
:: 削除対象数
set /a DELETE_COUNT=%TOTAL%-%RETAIN_COUNT%
echo %DELETE_COUNT% フォルダを削除します
:: ソートして古い順に DELETE_COUNT 個削除
set CNT=0
for /f "delims=" %%D in ('dir /b /ad /o:n "%BACKUP_DIR%\backup_*"') do (
set /a CNT+=1
if !CNT! leq %DELETE_COUNT% (
echo [DELETE] %%D
rmdir /S /Q "%BACKUP_DIR%\%%D"
)
)
echo 世代管理完了
実践例2:一時フォルダの定期清掃バッチ
@echo off
setlocal enabledelayedexpansion
:: 一時フォルダをまるごと削除して再作成(クリーンアップ)
set TEMP_DIRS=C:\work\tmp C:\app\cache C:\app\logs\old
set RESULT=0
for %%T in (%TEMP_DIRS%) do (
if exist "%%T\" (
echo [INFO] クリーンアップ: %%T
:: 読み取り専用属性を解除
attrib -r -h /s /d "%%T\*" >nul 2>&1
:: 削除
rmdir /S /Q "%%T"
if !errorlevel! neq 0 (
echo [ERROR] 削除失敗: %%T
set RESULT=1
) else (
:: フォルダを再作成
mkdir "%%T"
echo [OK] %%T を再作成しました
)
) else (
echo [INFO] 存在しないためスキップ: %%T
)
)
echo 清掃完了 (エラー: %RESULT%)
exit /b %RESULT%
実践例3:デプロイ前の旧バージョンフォルダ削除(goto :cleanup パターン)
@echo off
setlocal
:: デプロイ前に古いバージョンをバックアップして削除
set DEPLOY_DIR=C:\inetpub\wwwroot\myapp
set BACKUP_DIR=C:\backups\myapp_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
set NEW_BUILD=C:\build\output
set RESULT=0
:: ① 新しいビルドが存在するか確認
if not exist "%NEW_BUILD%\" (
echo [ERROR] ビルド出力が見つかりません: %NEW_BUILD%
exit /b 1
)
:: ② 既存デプロイをバックアップ
if exist "%DEPLOY_DIR%\" (
echo [INFO] 既存バージョンをバックアップ: %BACKUP_DIR%
xcopy "%DEPLOY_DIR%" "%BACKUP_DIR%\" /e /i /q
if %errorlevel% neq 0 (
echo [ERROR] バックアップ失敗
set RESULT=1
goto :cleanup
)
)
:: ③ 旧バージョンを削除
if exist "%DEPLOY_DIR%\" (
attrib -r /s /d "%DEPLOY_DIR%\*" >nul 2>&1
rmdir /S /Q "%DEPLOY_DIR%"
if %errorlevel% neq 0 (
echo [ERROR] 旧バージョン削除失敗(プロセスが使用中の可能性)
set RESULT=1
goto :cleanup
)
)
:: ④ 新バージョンを配置
xcopy "%NEW_BUILD%" "%DEPLOY_DIR%\" /e /i /q
if %errorlevel% neq 0 (
echo [ERROR] 新バージョン配置失敗
echo [INFO] バックアップから復元します: %BACKUP_DIR%
xcopy "%BACKUP_DIR%" "%DEPLOY_DIR%\" /e /i /q
set RESULT=1
)
:cleanup
if "%RESULT%"=="0" (
echo [OK] デプロイ完了
) else (
echo [ERROR] デプロイ失敗
)
exit /b %RESULT%
フォルダのコピーには フォルダをコピーする方法完全ガイド、ファイルの削除には ファイルを削除する方法完全ガイド も参照してください。
10. まとめ:フォルダ削除パターン別チートシート
| やりたいこと | コマンド・方法 | ポイント |
|---|---|---|
| フォルダをまるごと削除 | rmdir /S /Q "パス" |
完全削除・元に戻せない |
| 空フォルダのみ削除 | rmdir "パス"(/S なし) |
中身があるとエラー→利用して判定可 |
| 存在確認してから削除 | if exist "パス\" → rmdir |
末尾の \ でフォルダのみ判定 |
| 中身だけ削除・フォルダ残す | del /s /q + for /d → rmdir |
del はファイル・rmdir はサブフォルダ |
| 読み取り専用を含む削除 | attrib -r -h -s /s /d → rmdir |
属性解除してから削除 |
| ワイルドカードで一括削除 | for /d %%D in ("*") do rmdir |
rmdir 直接はワイルドカード不可 |
| 古いフォルダを自動削除 | forfiles /D -N /C "rd /S /Q @path" |
N 日以上前のフォルダを削除 |
| 最新N世代だけ残す | dir /b /o:n でソート → 古い順に削除 |
世代管理の標準パターン |
| ゴミ箱に移動(復元可能) | PowerShell Shell.Application |
ローカルドライブのみ有効 |
FAQ
Qrmdir と del の違いは何ですか?
Armdir(rd)はフォルダを削除するコマンドです。del はファイルを削除するコマンドで、フォルダ自体は削除できません。フォルダをまるごと削除するには rmdir /S /Q、フォルダ内のファイルだけ削除するには del /s /q "フォルダ\*" を使います。
Qrmdir で「アクセスが拒否されました」エラーが出ます。
A主な原因は3つです。①フォルダ内に読み取り専用ファイルがある → attrib -r -h -s /s /d で属性解除してから削除。②ファイルが他のプロセスに使用中 → タスクマネージャーや tasklist で確認して対象プロセスを終了。③管理者権限が必要なフォルダ → 管理者として実行。
Qrmdir でフォルダが削除できたか確認する方法は?
Aif %errorlevel% equ 0 で確認できます。rmdir の戻り値は成功時 0、失敗時 1 以上です。より確実に確認するには削除後に if not exist "フォルダ\" でフォルダが消えているかをチェックしてください。
Qネットワークドライブ上のフォルダを削除できますか?
Aできますが、アクセス権の確認が必要です。rmdir /S /Q "\\server\share\folder" のようにUNCパスで指定します。アクセス拒否になる場合は net use で認証セッションを確立してから実行してください。ネットワークフォルダはゴミ箱に入らず完全削除されます。
Q削除を取り消したい(元に戻したい)のですが。
Armdir /S /Q で削除したフォルダはゴミ箱に入らないため、通常の方法では復元できません。復元が必要な操作には事前にバックアップを取るか、PowerShell の Shell.Application を使ってゴミ箱に移動する方法を使ってください。ファイル復旧ソフト(Recuva 等)で復元できる場合もありますが、確実ではありません。
Qfor /d でフォルダが見つかりません。
Afor /d %%D in ("C:\path\*") の形式ではサブフォルダ直下のフォルダのみ対象です。再帰的にサブフォルダも検索したい場合は for /r /d またはdir /s /b /ad "C:\path" で一覧を取得してから処理してください。対象フォルダが存在しない場合もエラーになるため if exist で事前確認を推奨します。
