9

xという名前のフォルダーがあり、いくつかのサブフォルダーとファイルがあります。xに存在するyという名前のフォルダーとそのすべてのサブフォルダーを削除したいと思います。削除する必要のある上記のフォルダには、ファイルが含まれている場合と含まれていない場合があります。私はcmdまたはある種のバッチファイルを使用してこれを行うことができると信じていますが、私はコマンドラインの新しいbiであり、実際にいくつかのヘルプを使用できます。

簡単なことは、フォルダの名前をrdすることです。これは機能しますが、各フォルダを個別に削除するよりも良い方法があると思います。すべてのフォルダを通過するループのように。

ありがとう

編集:明確にするために、私はxの中にy(削除する必要のあるフォルダー)を持っています、そしてそれはxのサブフォルダーのどれにでもそしてどんな深さのレベルでもありえます。また、私は答えを見ています、そして、私がどんな答えでも受け入れるのに少し時間がかかるかもしれません。我慢してください:)

4

4 に答える 4

9

スクリプトの各部分を説明するために、このコメントの別の解決策を次に示します。

@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は、初期変数の前から取り出して、の後に値を入力することができます。=

set foldername=
set root=

バッチをサイレントに実行するためにecho、ループ部分と終了部分のを削除することもできます。pause

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

同じフォルダ名の複数のインスタンスを探してテストしqwertyましたC:\Test

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\
于 2012-05-01T15:09:59.110 に答える
6
FOR /D /R %%X IN (fileprefix*) DO RD /S /Q "%%X"

大事に使ってね…

RD コマンドの場合:

/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

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

于 2012-05-01T03:14:22.717 に答える
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 つのフォルダーのリストを生成しますが、最初のフォルダーが削除されると、残りの 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

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

于 2012-05-02T18:14:56.087 に答える
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
于 2017-06-25T11:10:30.057 に答える