Cách xóa tệp / thư mục con trong một thư mục cụ thể tại dấu nhắc lệnh trong Windows


308

Nói, có một biến được gọi %pathtofolder%, vì nó làm cho nó rõ ràng nó là một đường dẫn đầy đủ của một thư mục.

Tôi muốn xóa từng tập tin và thư mục con trong thư mục này, nhưng không phải chính thư mục đó.

Nhưng, có thể có lỗi như 'tệp / thư mục này đã được sử dụng' ... khi điều đó xảy ra, nó chỉ nên tiếp tục và bỏ qua tệp / thư mục đó.

Có một số lệnh cho điều này?



Thật điên rồ khi Windows khó thực hiện việc xóa các thư mục ... Hoặc tạo một thư mục bắt đầu bằng dấu chấm ... Cảm ơn chúa vì sự tích hợp Bash trong Windows! rm -rf path\to\folderhoạt động trong Windows 10 (hoặc có thể đến từ Git Bash ... dù bằng cách nào thì bạn cũng sẽ thử!)
Stijn de Witt

Câu trả lời:


256

Bạn có thể sử dụng tập lệnh shell này để dọn sạch thư mục và tệp trong C:\Temp nguồn :

del /q "C:\Temp\*"
FOR /D %%p IN ("C:\Temp\*.*") DO rmdir "%%p" /s /q

Tạo một tệp bó (giả sử, xóa.bat) có chứa lệnh trên. Đi đến vị trí đặt tệp xóa.bat và sau đó chạy lệnh: xóa.bat


20
Tôi đã thử nó nhưng không may các tập tin không bị xóa, chỉ có các thư mục con bị xóa. Ví dụ tôi có một thư mục có tên Test. Nó chứa 2 thư mục có tên là "Ripon" & "Wasim" và nó chứa một tệp có tên là "riponalwasim.txt". Các thư mục con Ripon và Wasim đã bị xóa nhưng riponalwasim.txt không bị xóa.
Ripon Al Wasim

16
Sử dụng dấu phần trăm duy nhất nếu bạn muốn chạy trực tiếp từ dòng lệnh, ví dụ:%p
Alex

2
Đáng buồn là điều này mất 2 dòng, nhưng ít nhất nó hoạt động! Tôi mệt mỏi với việc tìm kiếm một "lớp lót" đang hoạt động và sẽ đi với cái này, cảm ơn!
nightcoder

2
Bạn có thể sử dụng toán tử '&&' để thực thi hai lệnh trong một dòng mà không cần tệp bat (chú ý duy nhất '%' thay vì '%%'). del / s / q "myfolder *" && FOR / D% p IN ("myfolder *") DO rmdir "% p" / s / q
ravinsp

<for / F "delims =" %% i in ('dir / b / a-d') do (echo del "%% i" / q)> có thể giúp cho các tệp (chỉ cần loại bỏ tiếng vang đó)
grenix

340

rmdir là lệnh yêu thích tất cả thời gian của tôi cho công việc. Nó hoạt động để xóa các tập tin và thư mục lớn với các thư mục con. Một bản sao lưu không được tạo, vì vậy hãy chắc chắn rằng bạn đã sao chép các tệp của mình một cách an toàn trước khi chạy lệnh này.

RMDIR "FOLDERNAME" /S /Q

Điều này âm thầm loại bỏ thư mục và tất cả các tập tin và thư mục con.


65
Điều này dường như để loại bỏ trình điều khiển mà OP muốn giữ.
Fuzz Evans

4
Thao tác này sẽ tự xóa thư mục, vì vậy bạn sẽ cần thêm một lệnh khác: md FOLDERNAME(xem câu trả lời từ @rakoczyn bên dưới).
thdoan

4
Bạn có ý nghĩa gì bởi "sao lưu được tạo" ở đây? Tôi không thể thấy bất cứ điều gì có thể tạo ra bất kỳ loại sao lưu nào ...
Paul Groke

1
Thư mục không trống Tin nhắn được gửi đến như phản hồi!
Jamshaid Kamran

10
Để không xóa thư mục, hãy đặt thư mục hiện tại trước đó, sau đó sử dụng "." dưới dạng FOLDERNAME. Việc tạo lại nó sau đó không hoàn toàn giống nhau vì ACL có thể bị mất. cd "FOLDERNAME" RD . /S /Q
Moritz Cả

85

Giải pháp đơn giản nhất tôi có thể nghĩ đến là xóa toàn bộ thư mục bằng

RD /S /Q folderPath

Sau đó tạo lại thư mục này:

MD folderPath

5
Điều gì nếu bạn cho phép xóa nhưng không tạo thư mục mới ?? Tôi hy vọng nó có thể :)
Sandy

13
Đây là một giải pháp tồi, vì nó giới thiệu một cuộc đua trên hệ thống tệp cho nút thư mục, tức là lệnh thứ hai có thể thất bại nếu được thực thi ngay sau đó.
Rok Strniša

22
Ngoài ra, giải pháp không tốt nếu thư mục có quyền đặc biệt mà bạn vừa lấy được ahem (rất tiếc)
Immortal Blue

Đừng bỏ qua câu trả lời: 'Thư mục không trống.', Chỉ cần phát lệnh hai lần :-)
Kieran Ryan

1
RD và RMDIR là cùng một lệnh và vì bạn đã đăng câu trả lời này 9 tháng sau khi ai đó nêu cùng một câu trả lời, tại sao mọi người lại cho bạn điểm?
Chuyển

51

Điều này sẽ loại bỏ các thư mục và tập tin và để lại thư mục phía sau.

pushd "%pathtofolder%" && (rd /s /q "%pathtofolder%" 2>nul & popd)

4
Đối với bất cứ ai không chắc chắn về phương pháp này: nó chắc chắn không tạo lại thư mục. Không có 2>nul, nó xuất ra "Quá trình không thể truy cập tệp vì nó đang được sử dụng bởi một quy trình khác."
Rok Strniša

6
Tôi ghét rằng Windows không thể xóa các tập tin và thư mục đang được sử dụng bởi một số chương trình. Và tôi thích rằng bạn đã sử dụng nó trong lợi ích của bạn trong lớp lót này.
andref

Vì vậy, điều kỳ diệu này là cách chúng ta làm trống một thư mục trong Windows ?? Ấn tượng :)
mlvljr

3
@mlvljr Chỉ khi bạn muốn giữ thư mục gốc. RD /?sẽ chỉ cho bạn cách đơn giản để làm trống một thư mục.
foxidrive

1
Điều này là tốt nếu bạn cần quay trở lại vị trí bắt đầu của bạn, nếu không chỉ đơn giản CD mypath && RD /S .là đủ. Tôi không muốn rằng bạn phải lặp lại con đường của mình hai lần, đối với những con đường dài, nó trở nên khó đọc. Vì vậy, tôi sẽ chỉ thêm một set p="mypath"lúc đầu.
Amit N Nikol

39
@ECHO OFF

SET THEDIR=path-to-folder

Echo Deleting all files from %THEDIR%
DEL "%THEDIR%\*" /F /Q /A

Echo Deleting all folders from %THEDIR%
FOR /F "eol=| delims=" %%I in ('dir "%THEDIR%\*" /AD /B 2^>nul') do rd /Q /S "%THEDIR%\%%I"
@ECHO Folder deleted.

EXIT

... xóa tất cả các tệp và thư mục bên dưới thư mục đã cho, nhưng không xóa chính thư mục đó.


4
đây sẽ là câu trả lời đúng .. chỉ cần đảm đơn giản .. deletemyfoldercontents.bat tập tin .. bật trong con đường của bạn và nó hoạt động như một say mê ..
timbrown

3
Dòng lệnh DEL bỏ lỡ tùy chọn /Axóa các tệp có tập thuộc tính ẩn và %dir%\*phải được đặt trong dấu ngoặc kép giống như "%dir%\*"để làm việc với các thư mục chứa khoảng trắng hoặc một trong các ký tự này &()[]{}^=;!'+,`~. Và dòng lệnh FOR nên được sửa đổi thành for /F "eol=| delims=" %%I in ('dir "%dir%\*" /AD /B 2^>nul') do rd /Q /S "%dir%\%%I"FOR bỏ qua các thư mục với tập thuộc tính ẩn. DIR với các tùy chọn /AD /Bxuất ra tất cả các thư mục chỉ với tên của họ. BTW: dirkhông phải là một tên tốt cho một biến môi trường.
Mofi

1
không xóa thư mục con
RMiranda

1
@RMiranda, trong các thử nghiệm của tôi, nó thực hiện chính xác như OP yêu cầu. Bạn có trường hợp nó không xóa các thư mục con không?
thepip3r

Câu trả lời này có giải quyết được yêu cầu "có thể có lỗi như 'tệp / thư mục này đã được sử dụng' ... khi điều đó xảy ra, nó chỉ nên tiếp tục và bỏ qua tệp / thư mục đó." ?
Peter Mortensen

30
CD [Your_Folder]
RMDIR /S /Q .

Bạn sẽ nhận được một thông báo lỗi, cho bạn biết rằng lệnh RMDIR không thể truy cập vào thư mục hiện tại, do đó nó không thể xóa nó.

Cập nhật :

Từ nhận xét hữu ích này (nhờ Moritz Cả hai ), bạn có thể thêm &&vào giữa, vì vậy RMDIRsẽ không chạy nếu CDlệnh thất bại (ví dụ: tên thư mục bị nhập sai):

CD [Your_Folder] && RMDIR /S /Q .

Từ tài liệu tham khảo dòng lệnh của Windows :

/ S: Xóa một cây thư mục (thư mục được chỉ định và tất cả các thư mục con của nó, bao gồm tất cả các tệp).

/ Q: Chỉ định chế độ im lặng. Không nhắc xác nhận khi xóa cây thư mục. (Lưu ý rằng / q chỉ hoạt động nếu / s được chỉ định.)


1
Điều này là hoàn hảo để làm trống tạm thời, nhưng điều đó cd [Your_Folder]cực kỳ quan trọng - tôi sẽ phải nhớ điều đó vì vậy tôi không xóa chính thư mục đó ...
sage

5
Đây là giải pháp chính xác. Thêm &&giữa các lệnh thay vì ngắt dòng và bạn an toàn trước một CD bị lỗi.
Moritz Cả

Đây là một giải pháp đúng et đơn giản. Thậm chí hoạt động với shell lệnh Azure!
Philippe

Giải pháp khá tệ ... Ví dụ tôi cần xóa dòng lệnh này để cập nhật svn - Tôi muốn xóa tất cả các tệp và thư mục trước khi tôi thực hiện cập nhật svn vì có thể có một số thay đổi trên máy mà tôi sử dụng, nhưng có liên quan chỉ được kiểm tra trong các mục. Làm RMDIR / S / Q. cũng xóa liên kết SVN và do đó làm cho thư mục không còn thư mục svn nữa
Dominik Lemberger

Điều này khác với bốn câu trả lời trước như thế nào?
Peter Mortensen

9

RD là viết tắt của Thư mục XÓA.

/ S: Xóa tất cả các tệp và thư mục con bên cạnh thư mục. Sử dụng để loại bỏ toàn bộ cây thư mục.

/ Q: Yên tĩnh - không hiển thị xác nhận YN

Thí dụ :

RD /S /Q C:/folder_path/here

1
được ủng hộ vì là người duy nhất giải thích ý nghĩa /S/Qý nghĩa
SourceVisor

2
Số rdtương đương với rmdirvà sẽ tự xóa thư mục và không phải là điều OP muốn.
WesternGun

Có phải câu trả lời này giải quyết yêu cầu "có thể có lỗi như 'tệp / thư mục này đã được sử dụng' ... khi điều đó xảy ra, nó chỉ nên tiếp tục và bỏ qua tệp / thư mục đó."? Chẳng hạn, nó có hủy bỏ hoàn toàn thay vì tiếp tục không?
Peter Mortensen

8

Tôi sử dụng Powershell

Remove-Item c:\scripts\* -recurse

Nó sẽ loại bỏ nội dung của thư mục, không phải chính thư mục.


Câu trả lời của rhellem là gần đây, nhưng đó là câu trả lời duy nhất thực sự sẽ làm điều này cho tôi. (Giành chiến thắng 8.1, không phải bằng sự lựa chọn)
philologon

2
Từ dòng lệnh bó:powershell -Command "Remove-Item 'PathToMyDirectory\*' -Recurse -Force"
Rosberg Linhares

Lưu ý rằng "*" là cần thiết hoặc nó sẽ xóa thư mục.
mhenry1384

7

Không có câu trả lời nào được đăng vào ngày 2018-06-01, ngoại trừ dòng lệnh duy nhất được đăng bởi foxidrive , thực sự đã xóa tất cả các tệp và tất cả các thư mục / thư mục trong %PathToFolder%. Đó là lý do để đăng thêm một câu trả lời với một dòng lệnh đơn giản để xóa tất cả các tệp và thư mục con của thư mục cũng như một tệp bó với một giải pháp phức tạp hơn giải thích lý do tại sao tất cả các câu trả lời khác được đăng vào 2018-06-01 bằng DELFOR với RD không thể dọn sạch hoàn toàn một thư mục.


Giải pháp dòng lệnh đơn giản mà tất nhiên cũng có thể được sử dụng trong một tệp bó:

pushd "%PathToFolder%" 2>nul && ( rd /Q /S "%PathToFolder%" 2>nul & popd )

Dòng lệnh này chứa ba lệnh được thực thi lần lượt.

Lệnh đầu tiên PUSHD đẩy đường dẫn thư mục hiện tại trên stack và tiếp theo tạo %PathToFolder%thư mục hiện tại để chạy tiến trình lệnh.

Điều này cũng hoạt động cho các đường dẫn UNC theo mặc định vì các phần mở rộng lệnh được bật theo mặc định và trong trường hợp này PUSHD tạo một ký tự ổ đĩa tạm thời trỏ đến tài nguyên mạng được chỉ định đó và sau đó thay đổi ổ đĩa và thư mục hiện tại, sử dụng ký tự ổ đĩa mới được xác định.

PUSHD xuất ra thông báo lỗi sau để xử lý STDERR nếu thư mục được chỉ định hoàn toàn không tồn tại:

Hệ thống không thể tìm đường dẫn cụ thể.

Thông báo lỗi này được loại bỏ bằng cách chuyển hướng nó 2>nulđến thiết bị NUL .

Lệnh RD tiếp theo chỉ được thực thi nếu thay đổi thư mục hiện tại cho quy trình lệnh hiện tại thành thư mục được chỉ định thành công, tức là thư mục đã chỉ định tồn tại.

Lệnh RD với các tùy chọn /Q/Sloại bỏ một thư mục lặng lẽ với tất cả các thư mục con ngay cả khi thư mục được chỉ định chứa các tệp hoặc thư mục có thuộc tính ẩn hoặc với tập thuộc tính chỉ đọc. Thuộc tính hệ thống không bao giờ ngăn chặn việc xóa một tập tin hoặc thư mục.

Không bị xóa là:

  1. Các thư mục được sử dụng làm thư mục hiện tại cho bất kỳ quá trình đang chạy. Toàn bộ cây thư mục cho một thư mục như vậy không thể bị xóa nếu một thư mục được sử dụng làm thư mục hiện tại cho bất kỳ quá trình đang chạy.

  2. Các tệp hiện đang được mở bởi bất kỳ quy trình đang chạy nào với quyền truy cập tệp được đặt trên tệp đang mở để ngăn xóa tệp trong khi được mở bởi ứng dụng / quy trình đang chạy. Một tệp được mở như vậy cũng ngăn chặn việc xóa toàn bộ cây thư mục vào tệp đã mở.

  3. Các tệp / thư mục mà người dùng hiện tại không có quyền (NTFS) cần thiết để xóa tệp / thư mục, điều này cũng ngăn việc xóa cây thư mục vào tệp / thư mục này.

Lý do đầu tiên để không xóa thư mục được sử dụng bởi dòng lệnh này để xóa tất cả các tệp và thư mục con của thư mục đã chỉ định, nhưng không phải chính thư mục đó. Thư mục được tạo tạm thời thư mục hiện tại để chạy quy trình lệnh ngăn chặn việc xóa chính thư mục. Tất nhiên điều này dẫn đến kết quả đầu ra của một thông báo lỗi bằng lệnh RD :

Quá trình không thể truy cập tệp vì nó đang được sử dụng bởi một quy trình khác.

Tệp là thuật ngữ sai ở đây vì trong thực tế, thư mục đang được sử dụng bởi một quy trình khác, quy trình lệnh hiện tại đã thực thi lệnh RD . Vâng, trong thực tế một thư mục là dành cho các hệ thống tập tin một tập tin đặc biệt với thuộc tính tập tin thư mục mà giải thích thông báo lỗi này. Nhưng tôi không muốn đi quá sâu vào quản lý hệ thống tập tin.

Thông báo lỗi này, giống như tất cả các thông báo lỗi khác, có thể xảy ra do ba lý do được viết ở trên, bị loại bỏ bằng cách chuyển hướng nó 2>nultừ xử lý STDERR sang thiết bị NUL .

Lệnh thứ ba, POPD , được thực thi độc lập với giá trị thoát của lệnh RD .

POPD bật đường dẫn thư mục được đẩy bởi PUSHD từ ngăn xếp và thay đổi thư mục hiện tại để chạy quy trình lệnh vào thư mục này, tức là khôi phục thư mục hiện tại ban đầu. POPD xóa ký tự ổ đĩa tạm thời được tạo bởi PUSHD trong trường hợp đường dẫn thư mục UNC.

Lưu ý: POPD có thể âm thầm không thể khôi phục thư mục hiện tại ban đầu trong trường hợp thư mục hiện tại ban đầu là thư mục con của thư mục để xóa không còn tồn tại nữa. Trong trường hợp đặc biệt này %PathToFolder%vẫn là thư mục hiện tại. Vì vậy, nên chạy dòng lệnh ở trên không phải từ thư mục con của %PathToFolder%.

Một sự thật thú vị khác : Tôi đã thử dòng lệnh cũng sử dụng đường dẫn UNC bằng cách chia sẻ thư mục cục bộ C:\Tempvới tên chia sẻ Tempvà sử dụng đường dẫn UNC \\%COMPUTERNAME%\Temp\CleanTestđược gán cho biến môi trường PathToFoldertrên Windows 7. Nếu thư mục hiện tại đang chạy dòng lệnh là thư mục con của một cục bộ được chia sẻ folder truy cập sử dụng đường dẫn UNC, ví dụ C:\Temp\CleanTest\Subfolder1, Subfolder1sẽ bị xóa bởi RD , và tiếp theo popd không âm thầm trong việc đưa ra C:\Temp\CleanTest\Subfolder1một lần nữa thư mục hiện hành dẫn đến Z:\CleanTestcòn lại là thư mục hiện hành cho quá trình lệnh chạy. Vì vậy, trong trường hợp rất đặc biệt này, ký tự ổ đĩa tạm thời vẫn còn cho đến khi thư mục hiện tại được thay đổi, ví dụ như vớicd /D %SystemRoot%đến một thư mục địa phương thực sự tồn tại. Thật không may, POPD không thoát với giá trị lớn hơn 0 nếu không khôi phục thư mục hiện tại ban đầu khiến không thể phát hiện tình trạng lỗi rất đặc biệt này bằng cách chỉ sử dụng mã thoát của POPD . Tuy nhiên, có thể cho rằng không ai từng gặp phải trường hợp lỗi rất đặc biệt này vì các đường dẫn UNC thường không được sử dụng để truy cập các tệp và thư mục cục bộ.

Để hiểu các lệnh được sử dụng tốt hơn nữa, hãy mở một cửa sổ nhắc lệnh, thực hiện các lệnh sau và đọc trợ giúp được hiển thị cho từng lệnh một cách cẩn thận.

  • pushd /?
  • popd /?
  • rd /?

Một dòng với nhiều lệnh sử dụng tệp bó Windows giải thích các toán tử &&&được sử dụng ở đây.


Tiếp theo chúng ta hãy xem xét giải pháp tệp bó bằng lệnh DEL để xóa các tệp trong %PathToFolder%FORRD để xóa các thư mục con trong %PathToFolder%.

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Clean the folder for temporary files if environment variable
rem PathToFolder is not defined already outside this batch file.
if not defined PathToFolder set "PathToFolder=%TEMP%"

rem Remove all double quotes from folder path.
set "PathToFolder=%PathToFolder:"=%"

rem Consisted the folder path only of double quotes?
if not defined PathToFolder goto EndCleanFolder

rem Remove a backslash at end of folder path.
if "%PathToFolder:~-1%" == "\" set "PathToFolder=%PathToFolder:~0,-1%"

rem Consisted folder path only of a backslash (with one or more double quotes)?
if not defined PathToFolder goto EndCleanFolder

rem Delete all files in specified folder including files with hidden
rem or read-only attribute set, except the files currently opened by
rem a running process which prevents deletion of the file while being
rem opened by the application, or on which the current user has not
rem the required permissions to delete the file.
del /A /F /Q "%PathToFolder%\*" >nul 2>nul

rem Delete all subfolders in specified folder including those with hidden
rem attribute set recursive with all files and subfolders, except folders
rem being the current directory of any running process which prevents the
rem deletion of the folder and all folders above, folders containing a file
rem opened by the application which prevents deletion of the file and the
rem entire folder structure to this file, or on which the current user has
rem not the required permissions to delete a folder or file in folder tree
rem to delete.
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul

:EndCleanFolder
endlocal

Trước tiên, tệp bó đảm bảo rằng biến môi trường PathToFolderthực sự được xác định bằng đường dẫn thư mục không có dấu ngoặc kép và không có dấu gạch chéo ngược ở cuối. Dấu gạch chéo ngược ở cuối sẽ không phải là vấn đề, nhưng dấu ngoặc kép trong đường dẫn thư mục có thể có vấn đề vì giá trị PathToFolderđược nối với các chuỗi khác trong khi thực hiện tệp bó.

Quan trọng là hai dòng:

del /A /F /Q "%PathToFolder%\*" >nul 2>nul
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul

Lệnh DEL được sử dụng để xóa tất cả các tệp trong thư mục được chỉ định.

  • Tùy chọn /Alà cần thiết để xử lý thực sự tất cả các tệp bao gồm các tệp có thuộc tính ẩn mà DEL sẽ bỏ qua mà không sử dụng tùy chọn /A.
  • Tùy chọn /Flà cần thiết để buộc xóa các tệp với tập thuộc tính chỉ đọc.
  • Tùy chọn /Qnày là cần thiết để chạy một cách dễ dàng xóa nhiều tệp mà không nhắc người dùng nếu nhiều tệp thực sự bị xóa.
  • >nullà cần thiết để chuyển hướng đầu ra của tên tệp được viết để xử lý STDOUT đến thiết bị NUL không thể bị xóa do tệp hiện đang được mở hoặc người dùng không có quyền xóa tệp.
  • 2>nullà cần thiết để chuyển hướng đầu ra thông báo lỗi cho mỗi tệp không thể xóa từ xử lý STDERR sang thiết bị NUL .

Các lệnh FORRD được sử dụng để loại bỏ tất cả các thư mục con trong thư mục được chỉ định. Nhưng for /Dkhông được sử dụng vì FOR đang bỏ qua trong trường hợp này các thư mục con với tập thuộc tính ẩn. Vì lý do đó for /Fđược sử dụng để chạy dòng lệnh sau trong một quy trình lệnh riêng được bắt đầu trong nền với %ComSpec% /c:

dir "%PathToFolder%\*" /AD /B 2>nul

DIR xuất ra ở định dạng trần vì /Bcác mục nhập thư mục có thuộc tính D, tức là tên của tất cả các thư mục con trong thư mục được chỉ định độc lập với các thuộc tính khác như thuộc tính ẩn không có đường dẫn. 2>nulđược sử dụng để chuyển hướng đầu ra thông báo lỗi bằng DIR trên không có thư mục nào được tìm thấy từ tay cầm STDERR đến thiết bị NUL .

Toán tử chuyển hướng >phải được thoát với ký tự dấu mũ ^, trên dòng lệnh FOR được hiểu là ký tự bằng chữ khi trình thông dịch lệnh Windows xử lý dòng lệnh này trước khi thực hiện lệnh FOR thực thi dirdòng lệnh nhúng trong một quy trình lệnh riêng biệt bắt đầu trong nền.

FOR xử lý đầu ra bị bắt được viết để xử lý STDOUT của quy trình lệnh đã bắt đầu là tên của các thư mục con không có đường dẫn và không bao giờ được đặt trong dấu ngoặc kép.

FOR với tùy chọn /Fbỏ qua các dòng trống không xuất hiện ở đây vì DIR với tùy chọn /Bkhông xuất ra các dòng trống.

FOR cũng sẽ bỏ qua các dòng bắt đầu bằng dấu chấm phẩy là kết thúc mặc định của ký tự dòng. Tên thư mục có thể bắt đầu bằng dấu chấm phẩy. Vì lý do đó eol=|được sử dụng để xác định ký tự thanh dọc là ký tự cuối dòng mà không thư mục hoặc tệp nào có thể có trong tên của nó.

FOR sẽ phân chia dòng thành các chuỗi con bằng cách sử dụng dấu cách và tab ngang làm dấu phân cách và sẽ chỉ gán chuỗi phân tách không gian / tab đầu tiên cho biến vòng lặp được chỉ định I. Hành vi chia tách này không muốn ở đây vì tên thư mục có thể chứa một hoặc nhiều khoảng trắng. Do đó, delims=được sử dụng để xác định một danh sách trống các dấu phân cách để vô hiệu hóa hành vi phân tách dòng và được gán cho biến vòng lặp I, luôn luôn là tên thư mục đầy đủ.

Lệnh FOR chạy lệnh RD cho mỗi tên thư mục mà không có đường dẫn, đó là lý do tại sao trên dòng lệnh RD , đường dẫn thư mục phải được chỉ định một lần nữa được nối với tên thư mục con.

Để hiểu các lệnh được sử dụng và cách chúng hoạt động, hãy mở một cửa sổ nhắc lệnh, thực hiện các lệnh sau và đọc toàn bộ các trang trợ giúp được hiển thị cho mỗi lệnh rất cẩn thận.

  • del /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rd /?
  • rem /?
  • set /?
  • setlocal /?

5

Sử dụng Notepad để tạo tài liệu văn bản và sao chép / dán này:

rmdir /s/q "%temp%"
mkdir "%temp%"

Chọn Save As và tên tệp:

xóa_temp.bat

Lưu dưới dạng: Tất cả các tệp và nhấp vào Savenút.

Nó hoạt động trên mọi loại tài khoản (quản trị viên hoặc người dùng chuẩn). Chỉ cần chạy nó!

Tôi sử dụng một biến tạm thời trong ví dụ này, nhưng bạn có thể sử dụng bất kỳ biến nào khác! PS: Chỉ dành cho hệ điều hành Windows!


một giải pháp khá dễ dàng và sạch sẽ
Carlos Liu

4

Để xóa tập tin:

del PATH_TO_FILE

Để xóa thư mục có tất cả các tệp trong đó:

rmdir /s /q PATH_TO_FOLDER

Để xóa tất cả các tệp khỏi thư mục cụ thể (không xóa chính thư mục) thì hơi phức tạp một chút. del /s *.*không thể xóa các thư mục, nhưng xóa các tệp khỏi tất cả các thư mục con. Vì vậy, hai lệnh là cần thiết:

del /q PATH_TO_FOLDER\*.*
for /d %i in (PATH_TO_FOLDER\*.*) do @rmdir /s /q "%i"

Vâng cái này đúng rồi. Phải là hai bước. Điều này xứng đáng được nâng cao hơn, bởi vì nó giải thích tại sao, so với một câu trả lời được bình chọn nhiều hơn ở trên.
WesternGun

Dòng lệnh DEL bỏ lỡ tùy chọn /Axóa các tệp cũng có tập thuộc tính ẩn và tùy chọn /Fxóa cả các tệp có tập thuộc tính chỉ đọc và dấu ngoặc kép xung quanh đối số cuối cùng. Vì vậy, del /A /F /Q "PATH_TO_FOLDER\*"sẽ tốt hơn. Và dòng lệnh FOR nên được sửa đổi thành for /F "eol=| delims=" %%I in ('dir "PATH_TO_FOLDER\*" /AD /B 2^>nul') do rd /Q /S "PATH_TO_FOLDER\%%I"FOR bỏ qua các thư mục với tập thuộc tính ẩn. DIR với các tùy chọn /AD /Bxuất ra tất cả các thư mục PATH_TO_FOLDERchỉ bằng tên của họ.
Mofi

Điều này khác với (một số) các câu trả lời trước đó như thế nào?
Peter Mortensen

4

Bạn có thể làm điều đó bằng cách sử dụng lệnh sau để xóa tất cả nội dung và chính thư mục mẹ:

RMDIR [/S] [/Q] [drive:]path            

Điều này khác với hai câu trả lời trước như thế nào?
Peter Mortensen

Câu trả lời này có giải quyết được yêu cầu "có thể có lỗi như 'tệp / thư mục này đã được sử dụng' ... khi điều đó xảy ra, nó chỉ nên tiếp tục và bỏ qua tệp / thư mục đó." ?
Peter Mortensen

1

Tôi đã thử một vài trong số các phương pháp này, nhưng không có cách nào hiệu quả.

Tôi tìm thấy cách tiếp cận hai bước này trên trang web Windows Command Line :

forfiles /P %pathtofolder% /M * /C "cmd /c if @isdir==FALSE del @file"

forfiles /P %pathtofolder%  /M * /C "cmd /c if @isdir==TRUE rmdir /S /Q @file"

Nó hoạt động chính xác như tôi cần và theo quy định của OP.


Hai dòng lệnh có thể được kết hợp thành một dòng lệnh: Tùy chọn forfiles /P "%pathtofolder%" /M * /C "%SystemRoot%\System32\cmd.exe /C if @isdir==FALSE (del /A /F @file) else rd /Q /S @file" DEL/A được thêm vào để xóa cả các tệp có thuộc tính ẩn được đặt vì nếu không DEL sẽ tạo ra một thông báo lỗi không tìm thấy cho mỗi tệp ẩn %pathtofolder%. Tùy chọn DEL/F được thêm vào để xóa cả các tệp có thuộc tính chỉ đọc được đặt %pathtofolder%vì nếu không DEL sẽ tạo ra thông báo lỗi từ chối truy cập.
Mofi

Giải pháp này là chậm nhất trong tất cả các giải pháp chưa hoàn thành được đăng ở đây vì bắt đầu một cmd.exethể hiện cho mỗi tệp và mỗi thư mục trong %pathtofolder%. Ưu điểm là FORFILES không bỏ qua các thư mục có thuộc tính ẩn được đặt như FOR .
Mofi

Re "Nó hoạt động chính xác như tôi cần và theo quy định của OP." : Bạn đã kiểm tra yêu cầu "có thể có lỗi như 'tệp / thư mục này đã được sử dụng' ... khi điều đó xảy ra, nó chỉ nên tiếp tục và bỏ qua tệp / thư mục đó." ?
Peter Mortensen

0
@ECHO OFF
rem next line removes all files in temp folder
DEL /A /F /Q /S "%temp%\*.*"
rem next line cleans up the folder's content
FOR /D %%p IN ("%temp%\*.*") DO RD "%%p" /S /Q

Dòng thứ 2 sẽ xóa các tệp trong mỗi tệp khỏi tất cả các thư mục trong thư mục temp của Windows và dòng thứ 3 sẽ dọn sạch các thư mục bao gồm cả nội dung của nó.
Robie

Dòng lệnh FOR nên được sửa đổi thành for /F "eol=| delims=" %%I in ('dir "%TEMP%\*" /AD /B 2^>nul') do rd /Q /S "%TEMP%\%%I"FOR bỏ qua các thư mục với tập thuộc tính ẩn. DIR với các tùy chọn /AD /Bxuất ra tất cả các thư mục %TEMP%chỉ bằng tên của họ.
Mofi

Tài liệu cho DEL . Tôi nghĩ rằng bạn đang đi đúng hướng với / F: "Bỏ qua cài đặt chỉ đọc và xóa bằng mọi cách (FORCE)"
Peter Mortensen

-10

Sử dụng:

del %pathtofolder%\*.*   /s /f  /q

Thao tác này sẽ xóa tất cả các tệp và thư mục con %pathtofolder%, bao gồm các tệp chỉ đọc và không nhắc xác nhận.


9
Foe tôi điều này để lại các thư mục con trống trong% pathtofolder%.
DH

35
Nó KHÔNG xóa các thư mục con trong% pathtofolder%. Thật tệ, tôi không có tiếng để bỏ phiếu trả lời sai này
Vitalii Korsakov

1
Như Vitalii Korsakov đã chỉ ra, điều này sẽ xóa tất cả các tệp và tệp khỏi các thư mục con, nhưng để lại các thư mục con tại chỗ mà OP cũng yêu cầu cách loại bỏ.
Fuzz Evans

6
Mặc dù lệnh này không để lại các thư mục trống, nhưng nó gần với những gì được yêu cầu hơn là câu trả lời được chấp nhận. Tất nhiên điều này phụ thuộc vào hoàn cảnh. Trong trường hợp của tôi, tôi thà có các thư mục trống, hơn là các tệp còn lại trong thư mục gốc.
MarcusUA

nhưng làm thế nào chúng ta có thể xóa các thư mục và thư mục con đã mở trong chia sẻ mạng khi máy khách khác mở ổ chia sẻ có quyền truy cập ghi vào thư mục đó .. Lệnh psfile và tệp net sẽ đóng phiên tệp nhưng sau vài giây nó sẽ tạo tự động một phiên khác cho người dùng đó trong máy chủ ...
user1954762
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.