WindowsのCMDで複数フォルダを削除する方法|rmdirと実行前の確認

Windowsのコマンドプロンプト(CMD)で複数のフォルダを削除するには、対象ごとに rmdir /s "フォルダの絶対パス" を実行します。空白を含むパスは引用符で囲み、最初から確認を省く /q は付けないのが基本です。少数のフォルダなら、一覧を自動で削除に渡すよりも、1件ずつ確認して処理する方が対象を把握しやすくなります。

注意:本記事の rmdir・del による削除は、ごみ箱へ移動する操作ではありません。「ごみ箱から戻せばよい」と考えず、対象の外にバックアップを取り、復元できることを確認してから実行してください。削除の途中で失敗しても、既に消えたファイルは自動的には戻りません。

以下は、自分が削除してよいと確認済みの通常のローカル作業フォルダを扱う例です。表示専用のコマンドと実際に削除するコマンドを分けて紹介します。サンプルのパスを、自分の環境の確認済みパスに置き換えてください。

目次

まず確認:CMDとPowerShellでは同じ名前の意味が違う

スタートメニューで「cmd」を検索し、「コマンドプロンプト」を開きます。または Windows キー+R で cmd と入力します。Windows Terminalを使う場合も、開いているタブが「コマンドプロンプト」か「PowerShell」かを確認してください。通常の作業フォルダを扱うために、初めから管理者として起動する必要はありません。

  • CMDの rmdir(別名 rd)はフォルダを削除する組み込みコマンドです。/s など、スラッシュ形式のオプションを使います。
  • Windows上のPowerShellでは、rmdir・rd・del は通常 Remove-Item の別名です。CMD用の /s /q をそのまま渡すものではありません。
  • 本記事で「CMD」と記した例はコマンドプロンプト、「PowerShell」と記した例はPowerShellで実行します。

別名の定義は Microsoft LearnのRemove-Item、CMD側の仕様は rmdirのリファレンスで確認できます。

削除前に確認する6つのこと

  1. 対象と残すもの:削除するフォルダの絶対パスを記録し、似た名前の別フォルダ、残すフォルダ、バックアップ保存先と取り違えていないか確認します。ドライブ全体、WindowsやProgram Files、ユーザープロファイル全体を例の対象にしないでください。
  2. バックアップ:必要なファイルは削除対象の外に保存します。バックアップも対象の配下なら一緒に消えます。保存したファイルを開けるかも確認します。
  3. 中身と隠し項目:フォルダ名だけで判断せず、サブフォルダまで確認します。通常の一覧に見えない隠しファイルやシステム属性のファイルが含まれる場合もあります。
  4. リンクと保存場所:ジャンクション、シンボリックリンク、マウントされたフォルダなどが対象自身・途中の親フォルダ・配下にないか確認します。クラウド同期や共有先を含む場合も、通常のローカルフォルダと同じ前提で進めないでください。
  5. 利用中の作業:対象内のファイルを使うアプリを通常の手順で閉じ、保存を済ませます。他の人やサービスが使っている場所なら、管理者・所有者と調整します。
  6. 実行直前の再確認:一覧を見てから実行するまでに内容が変わることがあります。表示結果は削除対象を固定する仕組みではないため、書き込みが続く場所で一括処理しないでください。

CMDの基本操作:移動と一覧表示

作業場所を移す場合は、ドライブも切り替える cd /d を使います。削除対象そのものや、その配下を現在のフォルダにしないでください。例えば、削除対象を C:\Work\Delete Test\Folder A とするなら、その外側へ移動します。

cd /d "C:\Work"
cd

2行目の cd は現在の場所を表示します。移動に失敗したら原因を確認し、相対パスで削除を続けないでください。本記事の削除例は、作業場所への依存を減らすため絶対パスで書いています。cd /d の仕様は Microsoft Learnのcdを参照してください。

対象の親フォルダを、隠し項目も含めて表示するには次のコマンドを使います。これは表示だけで、削除しません。

dir /a "C:\Work\Delete Test"

dir だけでは隠し項目などが省かれます。/a を付けると、それらも一覧に含めます。対象の中身は、フォルダごとに確認します。

dir /a "C:\Work\Delete Test\Folder A"
dir /a "C:\Work\Delete Test\Folder B"

この一覧は、それぞれのフォルダの直下だけです。サブフォルダがあれば、その中も確認してください。読み取りエラーが出た場合は「表示できたものが全部」と考えず、削除を止めます。dir /a /s "対象パス" なら再帰的な一覧を表示できますが、出力が大量になったり、アクセスできない場所が残ったりするため、それだけで安全性を証明できるわけではありません。

再解析ポイントを普通のフォルダと混同しない

ジャンクションなどは、見た目のパスと実際の参照先が異なることがあります。以下は、指定した親フォルダの直下にある再解析ポイントを表示するための確認例です。

dir /a:l "C:\Work\Delete Test"

何も表示されなくても、配下全体にリンクがない証明にはなりません。この例は、親フォルダ自身やさらに上の経路、深いサブフォルダまでは検査しません。再解析ポイントには複数の種類があるため、「リンクだから参照先は絶対に消えない」「引用符で囲めば安全」と一括りにせず、種類と参照先を把握できないものは削除例の対象から外してください。

属性による表示は dirの仕様、リンクやマウントとの関係は Microsoft Learnの再解析ポイントの説明を参照してください。

rmdirで複数フォルダを1件ずつ削除する

空のフォルダだけを削除する

内容が空だと確認したフォルダには、/s を付けずに実行します。次のコマンドは実際の削除であり、通常は確認の質問を出しません。隠し項目を含めて中身が残っている場合は、空ではないとして削除できません。

rmdir "C:\Work\Delete Test\Empty Folder"

「空ではありません」と表示されても、反射的に /s を追加しないでください。空にするつもりの場所に何が残っているかを先に調べます。

中身も含めて削除する場合は /s を付ける

/s は、指定したフォルダだけでなく、その中のファイルとサブフォルダも削除します。以下はバックアップと対象の確認が済んだ後に実行する削除コマンドです。まず1件目だけを入力します。

rmdir /s "C:\Work\Delete Test\Folder A"

削除確認が表示されたら、そこに示されたパスをもう一度読みます。削除してよい場合のみ表示に従って承認し、違っていれば拒否します。確認は配下の全ファイルを1つずつ選ぶものではなく、そのフォルダツリーを削除してよいかという質問です。

1件目の処理後、エラーが出ていないか確認し、親フォルダの一覧を再表示して結果を調べます。問題がある場合は、2件目へ進みません。

dir /a "C:\Work\Delete Test"

1件目の結果を確認できたら、2件目も同じように実行します。複数行をまとめて貼り付けず、各フォルダの確認と結果確認を挟むのが基本です。

rmdir /s "C:\Work\Delete Test\Folder B"

/q は /s と組み合わせたときに確認を省く指定で、削除を安全にしたり、アクセス権を無視したりする指定ではありません。本記事では付けません。オプションの詳細は Microsoft Learnのrmdirに掲載されています。

ファイルだけならdelを使う。フォルダ削除とは別の操作

CMDの del はファイル削除用です。フォルダ名を渡すとその中のファイルが削除対象になりますが、フォルダ自体を消すためのコマンドではありません。フォルダを消す前に、毎回 del で中身を空にする必要もありません。

例えば1つのファイルを確認付きで削除するなら、/p を使います。これもごみ箱へ移動する操作ではありません。

del /p "C:\Work\Delete Test\old-note.txt"
  • /p:対象ファイルの削除前に確認します。
  • /f:読み取り専用ファイルの削除に関する指定です。権限や使用中の問題を何でも解決するオプションではありません。
  • /s:サブフォルダも含めて、指定に一致するファイルを削除する指定です。フォルダツリーそのものの削除とは異なります。

ワイルドカードを使うと対象が広がるため、このガイドでは del による一括削除例は扱いません。del の仕様と警告は Microsoft Learnのdelで確認してください。

バッチファイルにまとめる場合も、固定した対象と確認を残す

バッチファイルは .cmd または .bat のテキストファイルです。定型作業に役立ちますが、書かれたコマンドを上から実行するため、単に削除コマンドを並べるだけでは、失敗やキャンセルの後も次へ進んでしまいます。少数の対象なら、前述の手動実行で十分です。

次は、内容を確認済みの2つのフォルダを明記した小さな例です。このコードは表示専用ではなく、実際に削除します。各 rmdir /s の確認を残し、終了コードが1以上、または対象フォルダの残存を検出した時点で後続を止めます。

@echo off
setlocal DisableDelayedExpansion

rmdir /s "C:\Work\Delete Test\Folder A"
if errorlevel 1 goto stopped
if exist "C:\Work\Delete Test\Folder A\" goto stopped

rmdir /s "C:\Work\Delete Test\Folder B"
if errorlevel 1 goto stopped
if exist "C:\Work\Delete Test\Folder B\" goto stopped

echo Commands finished. Review the messages and parent folder.
goto end

:stopped
echo Stopped. Check the messages and remaining items before continuing.

:end
endlocal

例えば reviewed-delete.cmd として、削除対象の外に保存します。ファイル名が .cmd.txt になっていないか確かめ、内容を読み直してから、既に開いているCMDで実行してください。ダブルクリックだと処理後に画面が閉じてエラーを見落とすことがあります。

この例は、読める通常の作業フォルダを対象とした補助であり、全件成功を保証する仕組みではありません。拒否してフォルダが残れば残存チェックで止まりますが、存在確認自体がアクセス制限や同時変更の影響を受けることもあります。終了メッセージだけで完了とせず、元の2件のリストと親フォルダの一覧を照合してください。途中で止まっても、既に削除した1件目は戻りません。

if errorlevel 1 は終了コードが1以上かを判定します。ここでは括弧ブロック内の %ERRORLEVEL% 展開や、文字列のコマンド再評価を避けています。詳細は if、goto、setlocalを参照してください。

パスの引用符とリスト読み込みの注意点

CMDでは空白や & などを含むパスを二重引用符で囲みます。ただし、引用符は「あらゆる文字をそのまま扱う」保証ではありません。%名前% は環境変数として展開され、遅延展開が有効なら !名前! も解釈されます。上のバッチは遅延展開を無効にしていますが、% を含む任意のファイル名まで安全に自動処理する汎用スクリプトではありません。

削除候補をテキストに記録すること自体は有用です。ただし、テキストをそのまま for /f に渡して削除する例は避けてください。既定では空白で区切った先頭の項目だけを扱うなど、通常の「1行=1パス」とは異なる解析をします。引用符や delims= だけで文字コード、変数展開、空行、コメント行などの問題がすべて解決するわけでもありません。

本記事では、候補リストは人が確認するために使い、最終的な対象を明示したコマンドと分離します。CMDの解釈は cmdのリファレンス、リスト解析は forのリファレンスを参照してください。

名前パターンによる候補抽出は、まず表示だけにする

親フォルダの直下で backup_ から始まるフォルダを調べるには、次のように表示します。削除コマンドは含んでいません。

dir /a:d "C:\Work\Delete Test\backup_*"

/a:d はディレクトリに絞る指定です。配下を再帰的に検索する例ではありません。CMDのワイルドカードは短いファイル名の対応によって予想外の項目に一致することもあるため、表示された実名とパスを確認してください。名前が一致しても、中身が不要だとは限りません。

確認後は必要なフォルダだけを選び、前述のように絶対パスを明記して1件ずつ扱います。この一覧を rmdir に直結したり、for /d の本体を無条件の削除にしたりしないでください。ワイルドカードの注意は Microsoft Learnのdirにあります。

日付で候補を探す場合:古いフォルダにも新しいファイルが入る

「30日前より古く作られたフォルダ」と「中のすべてのデータが30日以上使われていないフォルダ」は別です。CreationTime は、そのファイルやフォルダ自身の作成日時です。フォルダが古くても、昨日追加したファイルが入っていることがあります。フォルダの LastWriteTime に置き換えても、配下の全ファイルの最終更新日時を調べたことにはなりません。

次のコードはPowerShellに直接入力する、候補表示専用の例です。Windows PowerShell 5.1とPowerShell 7系で利用できる基本的なコマンドを使っています。現在時刻から30日前の日時を境界に、親フォルダ直下のフォルダを調べます。

$root = 'C:\Work\Delete Test'
$cutoff = (Get-Date).AddDays(-30)

Get-ChildItem -LiteralPath $root -Directory -Force -ErrorAction Stop |
    Where-Object { $_.CreationTime -lt $cutoff } |
    Select-Object FullName, CreationTime, LastWriteTime, Attributes
  • -LiteralPath は親パスの文字をワイルドカードとして扱わない指定です。
  • -Directory はフォルダに絞り、-Force は隠し項目なども表示に含めます。この -Force は表示用で、削除ではありません。また、アクセス権を無視するものでもありません。
  • -ErrorAction Stop を指定しているため、読み取りエラーを無視して処理を続けない構成です。途中まで出力された場合も、エラーを解消するまで完全な候補一覧とはみなしません。
  • Attributes に ReparsePoint がある項目は、普通のフォルダと分けて確認します。これも親経路や子孫全体の検査ではありません。
  • この例に Remove-Item を追加しないでください。表示されたパスごとに中身・保管期限・利用状況を確認してから、削除するかを判断します。

日時の意味は FileSystemInfo.CreationTime、抽出オプションは Get-ChildItem、エラー処理は PowerShellの共通パラメーターを参照してください。

PowerShellのLiteralPathとWhatIfを使う確認例

角括弧などを含む名前では、PowerShellの -Path に引用符を付けるだけではワイルドカード解釈を避けられません。正確なパスを指定するには -LiteralPath を使います。次は、選んだ1フォルダについて操作の予定を表示するだけの例です。

Remove-Item -LiteralPath 'C:\Work\Delete Test\Folder [A]' -Recurse -WhatIf

-WhatIf が付いているため削除は実行されません。ただし、子孫全件の内容確認、アクセス権の検証、将来の成功保証ではありません。CMDの rmdir に -WhatIf を付けても同じ機能にはなりません。

PowerShellで実削除へ進む場合も、候補抽出と削除を分離し、-Confirm で明示的な確認を残します。隠し項目があるからといって、理由を確かめず -Force を追加しないでください。Remove-Item もごみ箱への移動ではなく、エラー時の巻き戻しもありません。

また、CMDの変数を powershell -Command の文字列へ埋め込むと、パスの文字がPowerShellのコードとして解釈される危険があります。本記事ではその方式を使いません。PowerShell画面でデータとして扱い、パス自体に単一引用符が含まれる場合に '' と2個重ねるルールも含め、引用符のルールを確認してください。操作オプションは Remove-Itemを参照できます。

削除できないときの切り分け

「アクセスが拒否されました」

対象の所有者、削除が許可された場所か、属性、利用中のアプリなどを確認します。管理者として起動すれば必ず解決するわけではありません。権限を無差別に追加したり、所有権を変更したり、保護機能を無効にしたりして削除を押し通さないでください。組織や共有のデータなら、必要な権限と作業範囲を管理者に確認します。

「ディレクトリが空ではありません」

まず dir /a "対象パス" で隠し項目も確認します。空であることが条件の作業なら、何が残っているかを調べます。/s は「エラー修復」ではなく、中身も削除するという操作範囲の変更です。既に /s を使った場合は、その前に出たエラーや残ったファイルを確認してください。

「指定されたパスが見つかりません」

ドライブ、絶対パス、引用符、接続状態を確認します。名前の誤りや変数展開、既に削除済み・移動済みの可能性もあります。探すために対象を親フォルダへ広げたり、ワイルドカードに置き換えて削除を再実行したりしないでください。

「別のプロセスが使用中」

対象を開いているアプリを保存して閉じます。CMD自身の現在のフォルダが対象内なら、対象外へ移動してください。他の人やサービスの作業を止める可能性があるため、プロセスの強制終了や再起動は一般的な最初の手順にしません。現在のフォルダを削除できない点は rmdirの注意事項でも説明されています。

一部だけ消えた、または途中で止まった

削除処理は「全件成功か全件元どおりか」の一括取引ではありません。エラーメッセージを残し、元の対象リストと現在の残存項目を照合してください。最初から同じコマンドを繰り返すのではなく、何が消えて何が残ったかを確定してから、残った対象だけを改めて判断します。エラーを隠すリダイレクトも付けないでください。

ディスク破損が疑われる

削除できないという理由だけで、修復付きの chkdsk /f を実行しないでください。/f はファイルシステムのエラーを修復する指定で、ドライブのロックや再起動時のチェックが必要になることがあります。まずデータの保全を優先し、別途、管理者と診断・修復計画を立てます。詳細は Microsoft Learnのchkdskを参照してください。

演習:削除より先に、対象を正しく確認できるか試す

練習は、重要なデータがない独立したテスト用フォルダで行います。次の演習は候補の表示と読み取りまでで構いません。

  1. 空白を含む名前:「Folder A」と「Folder B」を用意し、引用符付きの dir /a で別々の内容を確認する。似た名前の「Folder AB」が対象でないことも確認する。
  2. 名前パターン:「backup_」で始まるフォルダと、残すフォルダを用意し、dir /a:d の結果を目視で照合する。自動削除へはつなげない。
  3. 日付:既存の古いテスト用フォルダに最近作成したファイルが入っている場合を観察する。日付の候補一覧に親が出ても、中のファイルまで古いとはいえない理由を説明する。
  4. 確認の拒否:実削除を練習する場合は、削除してよいダミー専用の場所だけを使う。確認を拒否した後に対象が残っていることと、複数件を途中で止めても以前の削除は取り消されないことを区別する。

まとめ

  • フォルダ削除はCMDの rmdir、ファイル削除は del。PowerShellの同名エイリアスとは区別する。
  • 絶対パスを引用符で囲み、バックアップ、隠し項目、サブフォルダ、リンク、利用状況を先に確認する。
  • 中身も消す場合は、対象を明記した rmdir /s を1件ずつ実行する。確認を省く /q は通常の例に付けない。
  • ワイルドカードや日付条件は候補表示に使い、そのまま削除へつなげない。古い親フォルダの中にも新しいデータがある。
  • 削除はごみ箱への移動ではなく、部分失敗も起こり得る。画面のメッセージと残存項目を確認してから次へ進む。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次