バッチスクリプトでrmdirコマンドを実行するときの「ディレクトリが空ではありません」エラーを解決するにはどうすればよいですか?


92

バッチスクリプトを作成していますが、スクリプトの一部でディレクトリとそのすべてのサブディレクトリを削除しようとしています。サブディレクトリが空でないという断続的なエラーが発生します。インデックス作成が原因であるという記事を1つ読みました。WSearchを無効にしましたが、最終的には再びエラーが発生しました。コマンドは次のとおりです。

rmdir /S /Q "C:\<dir>\"

Windowsが警告するファイルの種類について質問できますか?私の場合、これはPDFファイルを移動/コピーした直後にのみ発生します。
ジェイクスティーブンス-ハース

回答:


88

ハリー・ジョンストンが述べたのと同じ問題を経験しました。あなたのために空にすることを意図しrmdir /s /qているのに、ディレクトリが空ではなかったと文句を言うでしょう/s!個人的にはWindowsのバグだと思います。

私の回避策はdel、ディレクトリ自体を削除する前に、ディレクトリ内のすべてのものを処理することです。

del /f /s /q mydir 1>nul
rmdir /s /q mydir

1>nulは、の標準出力を非表示delにします。それ以外の場合は、削除するすべてのファイルを一覧表示します。)


内のいくつかのサブディレクトリmydirが同じ「空ではない」エラーを生成するシナリオに遭遇しました。私がしなければならなかったようcdmydirして実行しdel、これらのディレクトリのそれぞれと同様にファイルに。最終的にはうまくいきましたが、別のサブレベルでこのプロセスを3回繰り返さなければならなかったとしたら、かなり敗北したと感じていたでしょう。
gfullam 2016

@gfullam私が覚えている限り、私の方法は、どの深さでも、再帰的なサブディレクトリでも機能するはずです。それが何をするかdel /sです。
BoffinBrain 2016

エクスプローラー(おそらくmkdir => NO!)を使用して、フォルダーを追加(および名前を変更)すると、rd /s /q mydirコマンドのみを使用して削除のジョブが完了します。
マスターDJon19年

1
さて、私は窓の削除およびLinuxへの移行すると、この痛みよりも多くに簡単だと思う:)
RajnishCoder

1
@RajnishCoder Windowsでの生活は、基本的に回避策の世界です。この特定の問題は、Windows10の他の問題と比較して何もありません!
BoffinBrain

46

私はこの問題に精通しています。最も簡単な回避策は、条件付きで操作を繰り返すことです。開いているファイルやアクセス許可の問題が実際にない限り、2回続けて失敗するのを見たことがありません。

rd /s /q c:\deleteme
if exist c:\deleteme rd /s /q c:\deleteme

11
聖なるモリー、これはまだ意味がありません。なんと#!%#@!マイクロソフト
サムB

IF EXIST皮革Access is deniedやその他の状況。私はDIR c:\deletemeすべての前にエラーチェックのようなものを追加しました。
it3xl 2018

Windowsエクスプローラーをサブディレクトリで開いたり、ブラウジングしたりすると、これが2回続けて失敗します。したがって、必ず3回目に質問してください(実際に機能しました)
-Haas19年

実際、何も開いていないか、権限の問題がない状態で、2回続けて発生しています。私の記録は7回です。@BoffinbraiNのアプローチをお勧めします。
ジェイクスティーブンス-ハース


20

私はちょうど同じ問題に遭遇しました、そしてそれはいくつかのファイルが失われるか壊れていることに関係していました。この問題を修正するには、チェックディスクを実行するだけです。

chkdsk /F e:

これは、検索ウィンドウボックスまたはcmdプロンプトから実行できます。/Fそれは、ファイルを回復するように、見つかった問題を修正します。これが実行を終了したら、通常のようにファイルとフォルダを削除できます。


完璧、私は30分から試していました
トレックス2017

これにより、フォルダ内にいくつかの隠しファイルが見つかり、削除することができました。本当に厄介な😑
ビート

7

私は同様の問題を抱えていました、Windowsエクスプローラーを介して空のフォルダーを削除しようとしました。空ではないエラーが表示されたので、admin cmdで試してみようと思いましたが、ここでの回答はどれも役に立ちませんでした。

ファイルを空のフォルダに移動した後。空でないフォルダを削除できました


1
コメントで書いてください。
virb 2018

面白い。ただし、おそらくOPシナリオには関係ありません。
ハリージョンストン

ホーリーモリー、これは文字通り、これらの他のすべてのソリューションで機能した唯一の考えでした!
Seega

3

@gfullamが@BoffinbraiNの回答へのコメントで述べたように、<dir>削除しようとしているのはファイルを含むものではない可能性があります。<dir>「ディレクトリは空ではありません」というメッセージを受け取るサブディレクトリが存在する可能性があり、その場合の唯一の解決策は次のとおりです。ディレクトリを再帰的に繰り返し、含まれているすべてのファイルを手動で削除します...私は最終的に次のポートを使用することにしました。rm UNIXからの。rm.exeGit Bash、MinGW、Cygwin、GnuWin32などが付属しています。PATHに親ディレクトリがあり、UNIXシステムの場合と同じように実行する必要があります。

バッチスクリプトの例:

set PATH=C:\cygwin64\bin;%PATH%
rm -rf "C:\<dir>"

2

私のために働いたのは次のとおりです。RMDirコマンドがほぼ常に「ディレクトリが空ではありません」を発行するようです...

:Cleanup_Temporary_Files_and_Folders

Erase /F /S /Q C:\MyDir

RMDir /S /Q C:\MyDir
If  Exist  C:\MyDir  GoTo Cleanup_Temporary_Files_and_Folders

2

「C:\ Users \ UserName \ OneDrive \ Fonts」があり、これは「C:\ Windows \ Fonts」にmklink(/ D)されていましたが、同じ問題が発生しました。私の場合

cd "C:\ Users \ User Name \ OneDrive"

rd / sフォント

Y(アクションを確認するため)

助けて頂きました。それがあなたにも役立つことを願っています; D


2
バッチを実行するときに確認する必要がないように、/ qを追加します。
JonathanRosenne19年

1

私の場合、フォルダをルートディレクトリに移動しました。

move <source directory> c:\

次に、コマンドを実行してディレクトリを削除しました

rmdir c:\<moved directory> /s /q

2
rmdir c:\<moved directory> /s /q正解です
lalengua 2015

1
それは正解ではありません。ルート内のフォルダを削除すると、同じメッセージが表示される可能性があります。フォルダは空ではありません。
Gangnus 2016年

私はこれが古いスレッドであることを知っています。ただ、が...これは私のために働い言いたかった
マヌエル・リベラ

1

rd /s特定のファイルの削除を拒否する理由は、ディレクトリ内のファイルのREADONLYファイル属性が原因である可能性があります。

これを修正する適切な方法は、最初にすべてのファイルの属性をリセットすることです。

attrib -r %directory% /s /d
rd /s %directory%

非表示ファイルやシステムファイルなどの他のファイルが存在する可能性があるため、安全に再生したい場合は次のようにします。

attrib -h -r -s %directory% /s /d
rd /s %directory%

0

ハリー・ジョンストンの答えと同様に、私はそれが機能するまでループします。

set dirPath=C:\temp\mytest
:removedir
if exist "%dirPath%" (
    rd /s /q "%dirPath%" 
    goto removedir
)

0

Windowsは「設計上壊れている」場合があるため、空のフォルダを作成してから、バックアップモードで「壊れたフォルダ」を「空のフォルダ」とミラーリングする必要があります。

robocopy - cmd copy utility

/copyall - copies everything
/mir deletes item if there is no such item in source a.k.a mirrors source with
destination
/b works around premissions shenanigans

次のように空のディレクトリを作成します。

mkdir empty

壊れたフォルダを次のように空で上書きします。

robocopy /copyall /mir /b empty broken

その後、そのフォルダを削除します

rd broken /s
rd empty /s

これで問題が解決しない場合は、Shiftキーを押しながら再起動をクリックし、これらのコマンドをリカバリモードで再度実行して、「コマンドプロンプト付きのリカバリモード」で再起動してみてください。


はい、Robocopyは失敗した操作を自動的に再試行するため、OPシナリオで機能すると思います。/W:0不必要な遅延を避けるために指定することをお勧めします。/b管理者権限が必要なため、必要ない場合があります。リカバリモードはこの質問には関係ありません。これは、誰かが手動でディレクトリを削除しようとしているのではなく、バッチスクリプトについて話しているためです。
ハリージョンストン

-1

私は次の考えられる原因を考えることができます:

  1. より高い権限を必要とするファイルまたはサブディレクトリがあります
  2. WSearchだけでなく、ウイルススキャナーなどによって使用されているファイルがあります。

1.)については、試すことができます runas /user:Administrator、より高い権限を取得するか、コンテキストメニューから管理者としてバッチファイルを開始するためにます。それでも問題が解決しない場合は、管理者でさえ権限を持っていない可能性があります。次に、ディレクトリの所有権を引き継ぐ必要があります。

2.)Process Explorerをダウンロードし、をクリックFind/Find handle or DLL...またはを押してCtrl+F、ディレクトリの名前を入力し、誰がそれを使用しているかを調べます。可能であれば、ディレクトリを使用するアプリケーションを閉じます。


マシンの管理者アカウントは無効になっています。私は管理者グループに属していますが、管理者パスワードを知りません。許可の問題を回避するための他の提案はありますか?誰かがバッチから別のプログラム(vbaなど)を呼び出すことに言及しました。
メイヘム

@Mayhem:パーミッションを回避するのは非常に困難です...パスワードなしでそれを行うには、Windowsのバグを悪用する必要があるでしょう。
トーマスウェラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.