làm thế nào để làm trống thùng rác thông qua dấu nhắc lệnh?


80

Thông thường chúng ta xóa nội dung thùng rác bằng cách nhấp chuột phải vào nó và chọn "Empty Recycle Bin". Nhưng tôi có một yêu cầu trong đó tôi cần xóa nội dung thùng rác bằng cách sử dụng dấu nhắc lệnh. Điều này có khả thi không? Nếu vậy, làm thế nào tôi có thể đạt được nó?


2
Tôi chỉ cho phép Windows tự động xóa các tập tin lâu đời nhất khi Recycle Bin đạt kích thước tối đa của nó superuser.com/questions/69284/...
Matthew Khóa

Có cách nào mà không yêu cầu thêm bước sử dụng lời nhắc cmd quản trị không? Sẽ không sao nếu nó chỉ sử dụng tài khoản của tôi, tôi chỉ sử dụng một tài khoản trên PC của mình.
user742864

Câu trả lời:


91

Bạn có thể "làm trống" Thùng rác khỏi dòng lệnh một cách hiệu quả bằng cách xóa vĩnh viễn thư mục Thùng rác trên ổ đĩa chứa các tệp hệ thống. (Trong hầu hết các trường hợp, đây sẽ là C:ổ đĩa, nhưng bạn không nên mã hóa giá trị đó vì nó không phải lúc nào cũng đúng. Thay vào đó, hãy sử dụng %systemdrive%biến môi trường.)

Lý do mà chiến thuật này hoạt động là bởi vì mỗi ổ đĩa có một thư mục ẩn, được bảo vệ với tên $Recycle.bin, đó là nơi Thùng rác thực sự lưu trữ các tệp và thư mục đã xóa. Khi thư mục này bị xóa, Windows sẽ tự động tạo một thư mục mới.

Vì vậy, để loại bỏ các thư mục, sử dụng rdlệnh ( r Loại bỏ d irectory) với /stham số, mà chỉ ra rằng tất cả các tập tin và thư mục trong thư mục chỉ định cần được loại bỏ cũng như:

rd /s %systemdrive%\$Recycle.bin

Lưu ý rằng hành động này sẽ xóa vĩnh viễn tất cả các tệp và thư mục hiện có trong Thùng rác khỏi tất cả các tài khoản người dùng . Ngoài ra, bạn (rõ ràng) sẽ phải chạy lệnh từ dấu nhắc lệnh nâng cao để có đủ đặc quyền để thực hiện hành động này.


17
Một vài lưu ý nữa: thay đổi trạng thái thùng rác có thể không phản ánh trong Explorer (biểu tượng trên màn hình) cho đến khi bạn thực sự mở Thùng rác và / hoặc làm mới màn hình, nó chỉ ảnh hưởng đến ổ đĩa cụ thể đó; các tệp tái chế trên các ổ đĩa khác sẽ không bị ảnh hưởng, vì vậy bạn có thể không thực sự dọn sạch thùng rác bằng phương pháp này và tên thư mục có thể thay đổi theo phiên bản Windows (và tôi tin rằng hệ thống tệp cũng vậy). Nó có thể là $Recycle.bin, Recycled, Recycler, vv và bạn thậm chí có thể có nhiều hơn một nếu bạn multi-boot-chương trình như Norton Recovery Bin có thư mục riêng của họ.
Synetech

1
@Synetech, Làm thế nào để chúng ta tìm ra được nó $Recycle.bin, Recycledhoặc Recycler? Có một biến để làm điều đó hay là cách duy nhất thông qua việc bắt các ngoại lệ?
Pacerier

3
Lưu ý: Nếu bạn đang sử dụng điều này trong một tập lệnh, bạn cũng sẽ muốn chuyển một /qcông tắc để rdkhông cung cấp cho bạn thêm lời nhắc. rd /s /q %SYSTEMDRIVE%\$Recycle.bin
James Ko

Không hoạt động trên Windows 10. Không có gì xảy ra sau khi sử dụng lệnh này.
jdhao

1
Nhắc nhở điều này chỉ hoạt động trong CMD. Nếu bạn muốn nó chạy trong PowerShell, hãy thử cmd /c "rd /s %systemdrive%\$Recycle.bin"
Arcsector

29

Tôi thích recycle.exetừ Frank P. Westlake hơn . Nó cung cấp một trạng thái trước và sau tốt đẹp. (Tôi đã sử dụng các tiện ích khác nhau của Frank trong hơn mười năm ..)

C:\> recycle.exe /E /F
Recycle Bin: ALL
    Recycle Bin C:  44 items, 42,613,970 bytes.
    Recycle Bin D:   0 items, 0 bytes.
            Total:  44 items, 42,613,970 bytes.

Emptying Recycle Bin: ALL
    Recycle Bin C:   0 items, 0 bytes.
    Recycle Bin D:   0 items, 0 bytes.
            Total:   0 items, 0 bytes.

Nó cũng có nhiều cách sử dụng và tùy chọn khác (đầu ra được liệt kê là từ /?).

Recycle all files and folders in C:\TEMP:
  RECYCLE C:\TEMP\*

List all DOC files which were recycled from any directory on the C: drive:
  RECYCLE /L C:\*.DOC

Restore all DOC files which were recycled from any directory on the C: drive:
  RECYCLE /U C:\*.DOC

Restore C:\temp\junk.txt to C:\docs\resume.txt:
  RECYCLE /U "C:\temp\junk.txt" "C:\docs\resume.txt"

Rename in place C:\etc\config.cfg to C:\archive\config.2007.cfg:
  RECYCLE /R "C:\etc\config.cfg" "C:\archive\config.2007.cfg"

Điều này không có cùng một vấn đề mà Synetech đã đề cập? stackoverflow.com/questions/9238953/…
Pacerier

1
@Pacerier Tôi không hiển thị Thùng rác trên màn hình của mình nên trước đây tôi chưa bao giờ để ý xem biểu tượng có cập nhật hay không. Sau khi chỉ kiểm tra nó, biểu tượng được cập nhật chính xác sau khi làm trống thông qua recycle.exe. Đối với các thư mục có liên quan, tôi hy vọng rằng nó đang sử dụng API Win32 để làm trống Thùng rác. Phải nói rằng, tôi đã sử dụng công dụng này trong nhiều năm trên Windows bao gồm XP, 7, 8, 8.1 và Server 2003, 2012, 2012 R2. (Tôi có thể sử dụng nó trên Vista và Server 2008, nhưng không chạy hệ điều hành những rất dài, vì vậy tôi không thể nói chắc chắn ..)
kodybrown

1
Đúng vậy, nó không phải là một công cụ đặc biệt hữu ích, đặc biệt là vì đã có những cách tích hợp để làm việc đó.
Pacerier

2
@Pacerier được xây dựng theo cách !? Giống như điều hướng Windows Explorer bằng bàn phím và / hoặc chuột? Sử dụng biểu tượng trên màn hình (giả sử thùng rác thậm chí được hiển thị trên màn hình)? Không cái nào giải quyết được câu hỏi của op. Tôi thực sự nghĩ rằng có một lệnh ở đâu đó để làm trống thùng, như xóa lịch sử RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 1nhưng tôi không tìm thấy nó. Vì vậy, bạn nào có cách làm sẵn thì chia sẻ nhé!
kodybrown

1
@Pacerier: Đầu tiên, bạn đề xuất giải pháp này có những sai sót như RD /S [/Q]giải pháp - mà @wasatchwizard đã bác bỏ bằng cách thử nghiệm - thì RD /S [/Q]giải pháp tương tự đột nhiên lại vượt trội hơn, bởi vì nó được "tích hợp sẵn". điều đó có nghĩa gì? RD /S [/Q]có vấn đề @Synetech mô tả. Giải pháp này không.
zb226


11

Bạn có thể sử dụng tập lệnh powershell (điều này hoạt động đối với người dùng có chuyển hướng thư mục cũng như không để thùng rác của họ chiếm không gian lưu trữ máy chủ)

$Shell = New-Object -ComObject Shell.Application
$RecBin = $Shell.Namespace(0xA)
$RecBin.Items() | %{Remove-Item $_.Path -Recurse -Confirm:$false}

Kịch bản trên được lấy từ đây .

Nếu bạn có windows 10 và powershell 5 thì có tập Clear-RecycleBinlệnh .

Để sử dụng Clear-RecycleBinbên trong PowerShell mà không cần xác nhận, bạn có thể sử dụng Clear-RecycleBin -Force. Tài liệu chính thức có thể được tìm thấy tại đây


3
Rõ ràng RecycleBin rất hữu ích trong PowerShell trong các cửa sổ 10
Jin

Clear-RecycleBinđã xóa thành công một số tên thư mục không đúng định dạng trong thùng rác mà tôi không thể xóa bằng cách khác.
S. Tarık Çetin

5

Để lén lút xóa mọi thứ, hãy thử:

rd /s /q %systemdrive%\$Recycle.bin

5

Tôi biết mình đến bữa tiệc hơi muộn, nhưng tôi nghĩ mình có thể đóng góp giải pháp chủ quan hơn của mình.

Tôi đang tìm kiếm một tập lệnh có thể làm trống Thùng rác bằng lệnh gọi API, thay vì xóa tất cả các tệp và thư mục khỏi hệ thống tệp một cách thô bạo. Đã thất bại trong nỗ lực của tôi RecycleBinObject.InvokeVerb("Empty Recycle &Bin")(mà dường như chỉ hoạt động trong XP trở lên), tôi đã tình cờ gặp các cuộc thảo luận về việc sử dụng một hàm nhúng trong shell32.dll được gọi SHEmptyRecycleBin()từ một ngôn ngữ đã biên dịch. Tôi nghĩ, này, tôi có thể làm điều đó trong PowerShell và gói nó trong một tập lệnh kết hợp lô.

Lưu tệp này bằng phần mở rộng .bat và chạy nó để làm trống Thùng rác của bạn. Chạy nó với một /ycông tắc để bỏ qua xác nhận.

<# : batch portion (begins PowerShell multi-line comment block)
:: empty.bat -- http://stackoverflow.com/a/41195176/1683264

@echo off & setlocal

if /i "%~1"=="/y" goto empty

choice /n /m "Are you sure you want to empty the Recycle Bin? [y/n] "
if not errorlevel 2 goto empty
goto :EOF

:empty
powershell -noprofile "iex (${%~f0} | out-string)" && (
    echo Recycle Bin successfully emptied.
)
goto :EOF

: end batch / begin PowerShell chimera #>
Add-Type shell32 @'
    [DllImport("shell32.dll")]
    public static extern int SHEmptyRecycleBin(IntPtr hwnd, string pszRootPath,
        int dwFlags);
'@ -Namespace System

$SHERB_NOCONFIRMATION = 0x1
$SHERB_NOPROGRESSUI = 0x2
$SHERB_NOSOUND = 0x4

$dwFlags = $SHERB_NOCONFIRMATION
$res = [shell32]::SHEmptyRecycleBin([IntPtr]::Zero, $null, $dwFlags)

if ($res) { "Error 0x{0:x8}: {1}" -f $res,`
    (New-Object ComponentModel.Win32Exception($res)).Message }
exit $res

Đây là một phiên bản phức tạp hơn mà lần đầu tiên gọi SHQueryRecycleBin()để xác định xem thùng đã trống chưa trước khi gọi SHEmptyRecycleBin(). Đối với điều này, tôi đã loại bỏ choicexác nhận và /ychuyển đổi.

<# : batch portion (begins PowerShell multi-line comment block)
:: empty.bat -- http://stackoverflow.com/a/41195176/1683264

@echo off & setlocal
powershell -noprofile "iex (${%~f0} | out-string)"
goto :EOF

: end batch / begin PowerShell chimera #>
Add-Type @'

using System;
using System.Runtime.InteropServices;

namespace shell32 {
    public struct SHQUERYRBINFO {
        public Int32 cbSize; public UInt64 i64Size; public UInt64 i64NumItems;
    };

    public static class dll {
        [DllImport("shell32.dll")]
        public static extern int SHQueryRecycleBin(string pszRootPath,
            out SHQUERYRBINFO pSHQueryRBInfo);

        [DllImport("shell32.dll")]
        public static extern int SHEmptyRecycleBin(IntPtr hwnd, string pszRootPath,
            int dwFlags);
    }
}
'@

$rb = new-object shell32.SHQUERYRBINFO

# for Win 10 / PowerShell v5
try { $rb.cbSize = [Runtime.InteropServices.Marshal]::SizeOf($rb) }
# for Win 7 / PowerShell v2
catch { $rb.cbSize = [Runtime.InteropServices.Marshal]::SizeOf($rb.GetType()) }

[void][shell32.dll]::SHQueryRecycleBin($null, [ref]$rb)
"Current size of Recycle Bin: {0:N0} bytes" -f $rb.i64Size
"Recycle Bin contains {0:N0} item{1}." -f $rb.i64NumItems, ("s" * ($rb.i64NumItems -ne 1))

if (-not $rb.i64NumItems) { exit 0 }

$dwFlags = @{
    "SHERB_NOCONFIRMATION" = 0x1
    "SHERB_NOPROGRESSUI" = 0x2
    "SHERB_NOSOUND" = 0x4
}
$flags = $dwFlags.SHERB_NOCONFIRMATION
$res = [shell32.dll]::SHEmptyRecycleBin([IntPtr]::Zero, $null, $flags)

if ($res) { 
    write-host -f yellow ("Error 0x{0:x8}: {1}" -f $res,`
        (New-Object ComponentModel.Win32Exception($res)).Message)
} else {
    write-host "Recycle Bin successfully emptied." -f green
}
exit $res

Cải tiến rất tốt của kỹ thuật chimera hàng loạt / powershell (+1). iex-Ing có phải là ý tưởng của bạn? (btw nó có thể mã # C nhúng trong tập tin batch với nhiệm vụ msbuild inline mà không cần biên dịch exe)
npocmaka

@npocmaka Cảm ơn! Tôi nghĩ rằng nhiều người khác đã sử dụng iexcách này. Tôi quên nơi tôi nhặt ${%~f0}tương đương với gc "%~f0". Chính con mèo này đã biến tôi thành người out-string. Bạn có thể liên kết một ví dụ về nhúng C # trong tập lệnh hàng loạt với msbuild không? Google-fu của tôi hôm nay yếu.
rojo

1
ở đây - dostips.com/forum/... - mặc dù bạn không thể vượt qua đối số dòng lệnh trực tiếp - bạn sẽ cần phải xác định một biến với các đối số mà sau này có thể được chiết xuất từ các c # phần
npocmaka

và trong ví dụ trên, phiên bản .net không được tham số hóa.
npocmaka

4

trong khi

rd / s / q% systemdrive% \ $ RECYCLE.BIN

sẽ xóa thư mục $ RECYCLE.BIN khỏi ổ đĩa hệ thống, thường là c :, người ta nên xem xét xóa nó khỏi bất kỳ phân vùng có sẵn nào khác vì có một thư mục $ RECYCLE.BIN ẩn trong bất kỳ phân vùng nào trong ổ đĩa cục bộ và ổ đĩa ngoài (nhưng không có trong ổ đĩa di động, như ổ USB flash, không có thư mục $ RECYCLE.BIN). Ví dụ: tôi đã cài đặt một chương trình trong d :, để xóa các tệp mà nó đã chuyển vào Thùng rác, tôi nên chạy:

rd / s /qd:\$RECYCLE.BIN

Có thêm thông tin tại Super User tại Thùng rác tái chế từ dòng lệnh


Ahhhh Tôi đang cố gắng tìm ra lý do tại sao các lệnh được đề xuất ở trên không hoạt động. Chỉ định f: cho tôi đã làm cho nó hoạt động. Cảm ơn rất nhiều! <3
Phill

4

Tôi sử dụng powerhell oneliner này:

gci C:\`$recycle.bin -force | remove-item -recurse -force

Cũng hoạt động cho các ổ đĩa khác với C :,


3

tôi sử dụng các lệnh này trong một tệp hàng loạt để làm trống thùng rác:

del /q /s %systemdrive%\$Recycle.bin\*
for /d %%x in (%systemdrive%\$Recycle.bin\*) do @rd /s /q "%%x"

2

Có, bạn có thể Tạo một tệp hàng loạt với mã sau:

cd \Desktop

echo $Shell = New-Object -ComObject Shell.Application >>FILENAME.ps1
echo $RecBin = $Shell.Namespace(0xA) >>FILENAME.ps1
echo $RecBin.Items() ^| %%{Remove-Item $_.Path -Recurse -Confirm:$false} >>FILENAME.ps1


REM The actual lines being writen are right, exept for the last one, the actual thigs being writen are "$RecBin.Items() | %{Remove-Item $_.Path -Recurse -Confirm:$false}"   
But since | and % screw things up, i had to make some changes.

Powershell.exe -executionpolicy remotesigned -File  C:\Desktop\FILENAME.ps1

Về cơ bản, điều này tạo ra một tập lệnh powershell để dọn sạch thùng rác trong thư mục \ Desktop, sau đó chạy nó.


0

Tất cả các câu trả lời đều quá phức tạp. OP đã yêu cầu một cách để thực hiện việc này từ CMD.

Của bạn đây (từ tệp cmd):

powershell.exe /c "$(New-Object -ComObject Shell.Application).NameSpace(0xA).Items() | %%{Remove-Item $_.Path -Recurse -Confirm:$false"

Và có, nó sẽ cập nhật trong explorer.


0

Tạo tệp cmd với dòng:

for %%p in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if exist "%%p:\$Recycle.Bin" rundll32.exe advpack.dll,DelNodeRunDLL32 "%%p:\$Recycle.Bin"

0

Bạn có thể sử dụng lệnh PowerShell này.

Clear-RecycleBin -Force

Lưu ý : Nếu bạn muốn có lời nhắc xác nhận, hãy xóa cờ -Force

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.