як очистити recyclebin через командний рядок?


80

Зазвичай ми видаляємо вміст кошика, клацнувши правою кнопкою миші та вибираючи «Очистити кошик». Але у мене є вимога, коли мені потрібно видалити вміст кошика за допомогою командного рядка. Чи можливо це? Якщо так, то як я можу цього досягти?


2
Я просто дозволяю Windows автоматично видаляти найдавніші файли, коли кошик досягає максимального розміру superuser.com/questions/69284/…
Matthew Lock,

Чи є спосіб, який не вимагає додаткового кроку використання підказки адміністратора cmd? Це нормально, якщо це стосується лише мого облікового запису, я використовую лише один обліковий запис на своєму ПК.
user742864

Відповіді:


91

Ви можете ефективно "спорожнити" Кошик із командного рядка, остаточно видаливши каталог Корзини на диску, що містить системні файли. (У більшості випадків це буде C:диск, але не слід жорстко кодувати це значення, оскільки воно не завжди буде істинним. Натомість використовуйте%systemdrive% змінну середовища.)

Причина, по якій ця тактика працює, полягає в тому, що кожен диск має приховану, захищену папку з іменем $Recycle.bin, де насправді Кошик зберігає видалені файли та папки. Коли цей каталог видаляється, Windows автоматично створює новий каталог.

Таким чином, щоб видалити каталог, використовуйте rdкоманду ( г аліть д irectory) з /sпараметром, який вказує , що всі файли і директорії в межах зазначеної директорії повинні бути видалені , а також:

rd /s %systemdrive%\$Recycle.bin

Зверніть увагу, що ця дія назавжди видалить усі файли та папки, що перебувають у кошику, із усіх облікових записів користувачів . Крім того, вам (очевидно) доведеться запустити команду з підвищеного командного рядка, щоб мати достатні привілеї для виконання цієї дії.


17
Ще кілька застережень: зміна стану сміттєвого ящика може не відображатися в Провіднику (піктограма робочого столу), доки ви фактично не відкриєте Корзину та / або не оновите робочий стіл, це впливає лише на певний обсяг; перероблені файли на інших дисках не постраждають, тому, можливо, ви фактично не спорожняєте кошик цим методом, і назва каталогу може змінюватися залежно від версії Windows (і я також вважаю файлову систему). Може бути $Recycle.bin, Recycled, Recyclerі т.д. , і ви , можливо , навіть більше , ніж один , якщо ви мульти-завантаження-програма , як Norton Recovery Bin має свої власні каталоги.
Synetech

1
@Synetech, Як ми з'ясовуємо це його $Recycle.bin, Recycledабо Recycler? Чи існує така змінна змінної, чи це єдиний спосіб вловлювання винятків?
Пайсер

3
Примітка. Якщо ви використовуєте це у сценарії, ви також захочете передати /qкомутатор, щоб rdне отримувати додаткових запитів. rd /s /q %SYSTEMDRIVE%\$Recycle.bin
Джеймс Ко,

Не працює на моєму Windows 10. Після використання цієї команди нічого не відбувається.
jdhao

1
Нагадуємо, це працює лише в CMD. Якщо ви хочете, щоб він працював у PowerShell, спробуйте cmd /c "rd /s %systemdrive%\$Recycle.bin"
Arcsector

29

Я вважаю за краще recycle.exeвід Frank P. Westlake . Він забезпечує приємний статус до і після. (Я користуюся різними утилітами Франка вже більше десяти років ..)

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.

Він також має набагато більше застосувань та опцій (перелік виводиться з /?).

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"

Хіба це не має тієї самої проблеми, про яку згадує Synetech? stackoverflow.com/questions/9238953 / ...
Pacerier

1
@Pacerier Я не показую кошик на своєму робочому столі, тому ніколи раніше не помічав, оновлюється піктограма чи ні. Після того, як раз випробовувати його значок буде оновлюватися коректно після спорожнення через recycle.exe. Що стосується каталогів, я сподіваюся, що він використовує API Win32 для спорожнення кошика. Сказавши це, я використовував цей утиліт протягом багатьох років у Windows, включаючи XP, 7, 8, 8.1 та Server 2003, 2012, 2012 R2. (Я, мабуть, використовував його на Vista та Server 2008, але не запускав ці ОС дуже довго, тому не можу сказати напевно ..)
kodybrown

1
Так, це не особливо корисний інструмент, тим більше, що вже є вбудовані способи зробити це.
Pacerier

2
@Pacerier побудований у спосіб !? Як навігація Windows Explorer за допомогою клавіатури та / або миші? Використовуючи піктограму на робочому столі (припускаючи, що кошик навіть відображається на робочому столі)? Жодне з них не вирішує питання опера. Я справді думаю, що десь є команда для спорожнення смітника, наприклад видалення історії, RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 1але я її не знайшов. Тож, будь ласка, якщо у вас є вбудований спосіб, будь ласка, поділіться ним!
kodybrown

1
@Pacerier: Спочатку ви припускаєте, що у цього рішення є такі недоліки, як RD /S [/Q]рішення - яке @wasatchwizard спростувало тестуванням, - то саме те самеRD /S [/Q] рішення раптом є кращим, оскільки воно "вбудоване". Як це має сенс? RD /S [/Q]має проблеми, описані @Synetech. Це рішення цього не робить.
zb226

15

nircmd дозволяє це робити, набираючи текст

nircmd.exe emptybin

http://www.nirsoft.net/utils/nircmd-x64.zip
http://www.nirsoft.net/utils/nircmd.html


1
спасибі, мені потрібно, що коли у мене було багато в переробці та натискання вікон, щоб порожня доза не працювала, дякую.
shareef

@shareef Дякую за коментар :)
Рахул

11

Ви можете використовувати скрипт PowerShell (це також працює для користувачів із переспрямуванням папок, щоб їхні кошики не займали місце на сервері)

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

Наведений вище сценарій взято звідси .

Якщо у вас є вікна 10 і Powershell 5 є Clear-RecycleBincommandlet .

Для використання Clear-RecycleBinвсередині PowerShell без підтвердження, ви можете використовувати Clear-RecycleBin -Force. Офіційну документацію можна знайти тут


3
Clear RecycleBin корисний у PowerShell у Windows 10
Jin

Clear-RecycleBinуспішно видалив деякі неправильно сформовані імена папок у кошику, які я не міг видалити інакше.
S. Tarık Çetin


5

Я знаю, що трохи запізнився на вечірку, але думав, що можу внести своє суб’єктивно більш витончене рішення.

Я шукав сценарій, який спорожнив би Корзину за допомогою виклику API, а не грубо видаляв усі файли та папки з файлової системи. Не вдавшись у своїх спробах RecycleBinObject.InvokeVerb("Empty Recycle &Bin")(що, мабуть, працює лише в XP або старіших версіях), я випадково натрапив на обговорення використання функції, вбудованої в shell32.dll під назвоюSHEmptyRecycleBin() зі скомпільованої мови. Я подумав, привіт, я можу зробити це в PowerShell і обернути його гібридним пакетним сценарієм.

Збережіть це за допомогою розширення .bat і запустіть його, щоб очистити кошик. Запустіть його за допомогою /yперемикача, щоб пропустити підтвердження.

<# : 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

Ось більш складна версія, яка спочатку запускається, SHQueryRecycleBin()щоб визначити, чи не порожній бен до виклику SHEmptyRecycleBin(). Для цього я позбувся choiceпідтвердження та /yперейшов.

<# : 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

Дуже приємне вдосконалення техніки пакетної / потужної оболонки (+1). Це iexваша ідея? (до речі, можна вбудувати код C # у командний файл із вбудованими завданнями
msbuild

@npocmaka Дякую! Думаю, багато хто використовував iexцей спосіб. Я забуваю, де я взяв, що ${%~f0}еквівалентно gc "%~f0". Саме на цього кота мене перетворили out-string. Чи можете ви зв'язати приклад вбудовування C # у пакетний сценарій з msbuild? Мій Google-fu сьогодні слабкий.
rojo

1
тут - dostips.com/forum/… - хоча ви не можете передавати аргументи командного рядка безпосередньо - вам потрібно буде визначити змінну з аргументами, які згодом можна буде витягти з частини c #
npocmaka

а у прикладі вище .net версія не параметризована.
npocmaka

4

поки

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

видалить папку $ RECYCLE.BIN із системного диска, як правило, це c:, слід подумати про її видалення з будь-яких інших доступних розділів, оскільки прихована папка $ RECYCLE.BIN є в будь-якому розділі на локальних та зовнішніх дисках (але не в знімні диски, такі як флеш-накопичувач USB, у якому немає папки $ RECYCLE.BIN). Наприклад, я встановив програму в d :, щоб видалити файли, які вона перемістила в кошик, мені слід запустити:

rd / s /qd:\$RECYCLE.BIN

Додаткову інформацію можна отримати в Super User у порожньому кошику для переробки з командного рядка


Ааааа, я намагався зрозуміти, чому запропоновані вище команди не працювали. Зазначення f: для мого це змусило працювати. Дуже дякую! <3
Phill

4

Я використовую цей powerhell oneliner:

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

Працює також на інших дисках, ніж C:


3

я використовую ці команди в командному файлі для спорожнення кошика:

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

2

Так, ви можете створити пакетний файл із таким кодом:

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

Це в основному створює скрипт PowerShell, який очищає сміття в каталозі \ Desktop, а потім запускає його.


0

Усі відповіді занадто складні. OP запитував спосіб зробити це у CMD.

Ось (із файлу cmd):

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

І так, він оновиться у провіднику.


0

Створіть файл cmd з рядком:

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

Ви можете використовувати цю команду PowerShell.

Clear-RecycleBin -Force

Примітка . Якщо потрібно запит на підтвердження, видаліть прапор -Force

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.