2012-05-01 10 views
8

xという名前のフォルダにはいくつかのサブフォルダとファイルがあります。 xに存在するyという名前のフォルダと、そのすべてのサブフォルダを削除します。削除しなければならない前記フォルダは、ファイルを含んでも含まなくてもよい。私はcmdや何らかの種類のバッチファイルを使ってこれを行うことができると信じていますが、私はコマンドラインの新しいbiであり、本当にいくつかの助けを使うことができます。cmd/batchファイルを使用してディレクトリ内の名前xのすべてのフォルダを削除する方法

簡単なことは、動作するフォルダの名前をrdすることですが、私は個々のフォルダを個別に削除するよりも良い方法があると信じています。すべてのフォルダを通過するループのように。

おかげ

EDIT:だけ明確にするには、私は、xの内のy(削除する必要があるフォルダ)を持っている、そしてそれは、xのサブフォルダのいずれにもおよび深さの任意のレベルであることができます。また、私は答えを見ていると、私は任意の答えを受け入れるために時間がかかるかもしれません。私と一緒にご負担願います:)

答えて

7

は、スクリプトの各部分を記述するためにコメントし、このための別の解決策です:

@Echo OFF 
REM Important that Delayed Expansion is Enabled 
setlocal enabledelayedexpansion 
REM This sets what folder the batch is looking for and the root in which it starts the search: 
set /p foldername=Please enter the foldername you want to delete: 
set /p root=Please enter the root directory (ex: C:\TestFolder) 
REM Checks each directory in the given root 
FOR /R %root% %%A IN (.) DO (
    if '%%A'=='' goto end 
    REM Correctly parses info for executing the loop and RM functions 
    set dir="%%A" 
    set dir=!dir:.=! 
    set directory=%%A 
    set directory=!directory::=! 
    set directory=!directory:\=;! 
    REM Checks each directory 
    for /f "tokens=* delims=;" %%P in ("!directory!") do call :loop %%P 
) 
REM After each directory is checked the batch will allow you to see folders deleted. 
:end 
pause 
endlocal 
exit 
REM This loop checks each folder inside the directory for the specified folder name. This allows you to check multiple nested directories. 
:loop 
if '%1'=='' goto endloop 
if '%1'=='%foldername%' (
    rd /S /Q !dir! 
    echo !dir! was deleted. 
) 
SHIFT 
goto :loop 
:endloop 

あなたが最初の変数の前にあるから/pを取ると、ちょうどあなたドン場合=後にその値を入力することができます「Tは、プロンプトが表示されるようにしたい:

set foldername= 
set root= 

あなたはまた、サイレントバッチのループ部分と端部でpauseechoを削除することができます。

もう少し複雑かもしれませんが、コードは他の多くの用途にも適用できます。

私はC:\Testに同じフォルダ名qwertyの複数のインスタンスを探して、それをテストした:

C:\Test\qwerty 
C:\Test\qwerty\subfolder 
C:\Test\test\qwerty 
C:\Test\test\test\qwerty 

放置したことのすべてだった:

C:\Test\ 
C:\Test\test\ 
C:\Test\test\test\ 
4
FOR /D /R %%X IN (fileprefix*) DO RD /S /Q "%%X" 

は、RDコマンドの

...という使用しての世話を:コマンドFOR

/S  Removes all directories and files in the specified directory 
     in addition to the directory itself. Used to remove a directory 
     tree. 
/Q  Quiet mode, do not ask if ok to remove a directory tree with /S 

ファイルまたは変数のリストをループするために使用され、オプションは非常に覚えやすい、ディレクトリのみ再帰的です。ここで

+0

あなたはそれがまったく同じものに少し説明することができますか? fileprefixとは何ですか?そしてそれらの旗。今それを試してください。 – Achshar

+0

このリンクがお役に立てば幸いです。 http://www.robvanderwoude.com/batchcommands.php – StarPinkER

+2

@Achshar:基本的に、 'fileprefix'(' ... IN(Y *)DO ... ')ではなくYフォルダの名前を入れてください。また、Xフォルダのパスを '/ R'と' %% X'の間に置いてください(Jermaineは '/ R'スイッチが引数を必要とすることを忘れてしまいました。もう一つは、条件を追加して 'Y'フォルダを削除し、' Y * 'マスクにも一致する' Ysomething 'を削除する必要があります。このようなことが起こるかもしれません: '... DO IF" %%〜nxX "==" Y "RD ...'。 –

1

話題のこのタイプに共通する問題は、ということですいくつかのレベルのターゲットフォルダのインスタンスがある場合、高レベルのフォルダが削除されると、その下のすべてのフォルダが消えるため、ほとんどのメソッドでエラーが発生します。たとえば:

C:\X\Y\subfolder 
C:\X\Y\subfolder\one\Y 
C:\X\Y\subfolder\two\Y 
C:\X\Y\subfolder\three\Y 
C:\X\test 
C:\X\test\test 

前の例では、削除されますYという名前の4つのフォルダのリストを生成するが、彼らは、削除しようとしたしたとき最初の1の後に、エラーメッセージを引き起こして、残りの3名は、もはや存在しません削除されます。私はこれがあなたの場合の可能性であると理解しています。

この問題を解決するには、ボトムアップ順でフォルダを削除する必要があります。つまり、最内のフォルダを最初に削除し、最上位のフォルダを最後に削除する必要があります。これを達成する方法は、再帰サブルーチン介しれる:

@echo off 
rem Enter into top level folder, process it and go back to original folder 
pushd x 
call :processFolder 
popd 
goto :EOF 

:processFolder 
rem For each folder in this level 
for /D %%a in (*) do (
    rem Enter into it, process it and go back to original 
    cd %%a 
    call :processFolder 
    cd .. 
    rem If is the target folder, delete it 
    if /I "%%a" == "y" (
     rd /S /Q "%%a" 
    ) 
) 
exit /B 

この特定のケースでは、他の方法によって引き起こされる問題は、単に複数のエラーメッセージであるが、この処理順序が基本である場合、他の場合があります。

0

以下での.batください:

del /q "C:\Users\XXX\AppData\Local\Temp\*" 

FOR /D %%p IN ("C:\Users\XXX\AppData\Local\Temp\*.*") DO rmdir "%%p" /s /q 
関連する問題