2012-05-01 37 views
8

Tôi có một thư mục có tên x với một số thư mục con và tệp. Tôi muốn xóa một thư mục có tên y hiện diện trong x và tất cả các thư mục con của nó. Thư mục đã được xóa phải có hoặc không chứa bất kỳ tệp nào. Tôi tin rằng tôi có thể làm điều này bằng cách sử dụng cmd hoặc một số loại tập tin thực thi nhưng tôi là một dòng lệnh mới bi và thực sự có thể sử dụng một số trợ giúp.Cách xóa tất cả các thư mục có tên x trong thư mục bằng tệp cmd/batch

Điều đơn giản là xếp thứ tự tên của thư mục, nhưng tôi tin rằng có nhiều cách tốt hơn xóa từng thư mục riêng lẻ ... giống như một số vòng lặp đi qua tất cả các thư mục.

Cảm ơn

EDIT: Chỉ cần làm rõ, tôi có y (thư mục mà cần phải bị xóa) bên trong của x, và nó có thể đến bất kỳ thư mục con x và ở bất kỳ mức độ sâu. Ngoài ra tôi đang nhìn vào câu trả lời và có thể mất một thời gian để tôi chấp nhận bất kỳ câu trả lời nào. Hãy chịu với tôi :)

Trả lời

7

Dưới đây là một giải pháp cho điều này nhận xét để mô tả từng phần của kịch bản:

@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 

Bạn có thể lấy /p ra từ ở phía trước của các biến ban đầu và chỉ nhập các giá trị của họ sau khi = nếu bạn don 't muốn được nhắc nhở:

set foldername= 
set root= 

Bạn cũng có thể loại bỏ các echo ở phần vòng lặp và pause trong phần kết thúc cho đợt chạy âm thầm.

Điều này có thể phức tạp hơn một chút, nhưng mã có thể được áp dụng cho nhiều công dụng khác.

Tôi đã thử nghiệm nó tìm kiếm nhiều trường hợp của cùng tên thư mục qwerty trong C:\Test:

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

và tất cả những gì còn lại là:

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

chăm sóc Hãy sử dụng mà ...

cho lệnh 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 lệnh được sử dụng để lặp thông qua một danh sách các file hoặc các biến , các tùy chọn rất dễ dàng để ghi nhớ, Directory chỉ đệ quy.

+0

bạn có thể giải thích một chút về chính xác những gì nó? fileprefix là gì? và những lá cờ đó ... thử ngay bây giờ. – Achshar

+0

Hy vọng liên kết này có thể giúp bạn. http://www.robvanderwoude.com/batchcommands.php – StarPinkER

+2

@Achshar: Về cơ bản, đặt tên thư mục Y thay vì 'fileprefix' ('… IN (Y *) DO… '). Ngoài ra, đặt đường dẫn của thư mục X giữa '/ R' và' %% X' (Jermaine bỏ lỡ thực tế là chuyển đổi '/ R' yêu cầu đối số, thư mục gốc để đi qua). Và một điều nữa, bạn cũng sẽ cần phải thêm một điều kiện để đảm bảo rằng bạn đang xóa một thư mục 'Y' và không phải là một' Ysomething' cũng sẽ khớp với mặt nạ 'Y *'. Một cái gì đó như thế này có thể làm: '... DO IF" %% ~ nxX "==" Y "RD…'. –

1

Một vấn đề thường gặp với loại hình này chủ đề là nếu có trường hợp của thư mục đích ở nhiều cấp độ, hầu hết các phương pháp đều gây ra lỗi vì khi một thư mục cấp cao bị xóa, tất cả các thư mục bên dưới sẽ biến mất. Ví dụ:

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 

dụ trước tạo ra một danh sách 4 thư mục có tên Y đó sẽ bị xóa, nhưng sau khi người đầu tiên bị xóa ba tên còn lại không còn tồn tại, gây ra một thông báo lỗi khi họ đang cố gắng để xóa . Tôi hiểu đây là một khả năng trong trường hợp của bạn.

Để giải quyết vấn đề này, các thư mục phải được xóa trong thứ tự từ dưới lên, nghĩa là thư mục trong cùng phải được xóa đầu tiên và thư mục cấp cao nhất phải được xóa cuối cùng.Các cách để đạt được điều này là thông qua một chương trình con đệ quy :

@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 

Mặc dù trong trường hợp đặc biệt này những vấn đề gây ra bởi các phương pháp khác chỉ là nhiều thông báo lỗi, có những trường hợp khác khi để xử lý này là nền tảng.

0

Make .bat với sau:

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

FOR /D %%p IN ("C:\Users\XXX\AppData\Local\Temp\*.*") DO rmdir "%%p" /s /q 
Các vấn đề liên quan