jak opróżnić kosz za pomocą wiersza poleceń?

80

Zwykle usuwamy zawartość kosza, klikając go prawym przyciskiem myszy i wybierając opcję „Opróżnij kosz”. Ale mam wymaganie, w którym muszę usunąć zawartość kosza za pomocą wiersza polecenia. czy to możliwe? Jeśli tak, jak mogę to osiągnąć?

user1016403
źródło
2
Po prostu pozwoliłem systemowi Windows automatycznie usunąć najstarsze pliki, gdy Kosz osiągnie maksymalny rozmiar superuser.com/questions/69284/ ...
Matthew Lock
Czy istnieje sposób, który nie wymaga dodatkowego kroku przy użyciu polecenia administratora cmd? W porządku, jeśli obsługuje tylko moje konto, używam tylko jednego konta na moim komputerze.
user742864

Odpowiedzi:

91

Możesz skutecznie „opróżnić” Kosz z wiersza poleceń, trwale usuwając katalog Kosza na dysku zawierającym pliki systemowe. (W większości przypadków będzie to C:dysk, ale nie należy zakodować tej wartości na stałe, ponieważ nie zawsze będzie to prawda. Zamiast tego użyj %systemdrive%zmiennej środowiskowej).

Powodem, dla którego ta taktyka działa, jest to, że każdy dysk ma ukryty, chroniony folder o nazwie $Recycle.bin, w którym Kosz faktycznie przechowuje usunięte pliki i foldery. Po usunięciu tego katalogu system Windows automatycznie tworzy nowy katalog.

Aby więc usunąć katalog, użyj rdpolecenia ( r emove d irectory) z /sparametrem, który wskazuje, że wszystkie pliki i katalogi w określonym katalogu również powinny zostać usunięte:

rd /s %systemdrive%\$Recycle.bin

Zwróć uwagę, że ta czynność spowoduje trwałe usunięcie wszystkich plików i folderów znajdujących się obecnie w Koszu ze wszystkich kont użytkowników . Ponadto (oczywiście) będziesz musiał uruchomić polecenie z wiersza polecenia z podwyższonym poziomem uprawnień, aby mieć wystarczające uprawnienia do wykonania tej czynności.

Cody Gray
źródło
17
Kilka dodatkowych zastrzeżeń: zmiana stanu kosza może nie odzwierciedlać się w Eksploratorze (ikona na pulpicie), dopóki faktycznie nie otworzysz Kosza i / lub nie odświeżysz pulpitu, wpłynie tylko na ten konkretny wolumin; nie będzie to miało wpływu na odzyskane pliki na innych dyskach, więc możesz nie opróżniać kosza za pomocą tej metody oraz nazwa katalogu może się różnić w zależności od wersji systemu Windows (i uważam, że również system plików). To może być $Recycle.bin, Recycled, Recycler, itd., A może nawet więcej niż jeden, jeśli multi-boot-programy takie jak Norton Recovery Bin mają własne katalogi.
Synetech
1
@Synetech, w jaki sposób dowiedzieć się go $Recycle.bin, Recycledalbo Recycler? Czy istnieje zmienna, która to robi, czy jest to jedyny sposób na wyłapywanie wyjątków?
Pacerier,
3
Uwaga: jeśli używasz tego w skrypcie, będziesz również chciał przekazać /qprzełącznik, więc rdnie wyświetla dodatkowego monitu. rd /s /q %SYSTEMDRIVE%\$Recycle.bin
James Ko
Nie działa w moim systemie Windows 10. Po użyciu tego polecenia nic się nie dzieje.
jdhao
1
Przypomnij, że działa to tylko w CMD. Jeśli chcesz, aby działał w PowerShell, wypróbuj cmd /c "rd /s %systemdrive%\$Recycle.bin"
Arcsector
29

Wolę recycle.exeod Franka P. Westlake'a . Zapewnia dobry stan przed i po. (Używam różnych narzędzi Franka od ponad dziesięciu lat ...)

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.

Ma również wiele innych zastosowań i opcji (wymienione dane wyjściowe pochodzą z /?).

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"
kodybrown
źródło
Czy to nie ma tego samego problemu, o którym wspomniał Synetech? stackoverflow.com/questions/9238953/…
Pacerier
1
@Pacerier Nie pokazuję Kosza na moim pulpicie, więc nigdy wcześniej nie zauważyłem, czy ikona się aktualizuje, czy nie. Po przetestowaniu ikona jest poprawnie aktualizowana po opróżnieniu za pomocą recycle.exe. Jeśli chodzi o katalogi, spodziewam się, że używa API Win32 do opróżnienia Kosza. Powiedziawszy to, używam tego narzędzia przez wiele lat w systemie Windows, w tym XP, 7, 8, 8.1 i Server 2003, 2012, 2012 R2. (Prawdopodobnie używałem go na Vista i Server 2008, ale nie uruchamiałem tych systemów bardzo długo, więc nie mogę powiedzieć na pewno ...)
kodybrown
1
Tak, nie jest to szczególnie przydatne narzędzie, zwłaszcza, że ​​istnieją już wbudowane sposoby, aby to zrobić.
Pacerier,
2
@Pacerier zbudowany na różne sposoby !? Lubisz nawigować w Eksploratorze Windows za pomocą klawiatury i / lub myszy? Używając ikony na pulpicie (zakładając, że kosz jest nawet wyświetlany na pulpicie)? Żadne z nich nie rozwiązuje pytania operatora. Naprawdę myślę, że gdzieś jest polecenie opróżnienia kosza, na przykład usunięcie historii, RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 1ale go nie znalazłem. Więc proszę, jeśli masz wbudowany sposób, udostępnij go!
kodybrown
1
@Pacerier: Najpierw sugerujesz, że to rozwiązanie ma wady, takie jak RD /S [/Q]rozwiązanie - które @wasatchwizard obalił testując - potem dokładnie to samo RD /S [/Q]rozwiązanie nagle staje się lepsze, ponieważ jest „wbudowane”. W jaki sposób to ma sens? RD /S [/Q]ma problemy opisane przez @Synetech. To rozwiązanie nie.
zb226
11

Możesz użyć skryptu PowerShell (działa to również w przypadku użytkowników z przekierowaniem folderu, aby ich kosze na śmieci nie zajmowały miejsca na serwerze)

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

Powyższy skrypt pochodzi z tego miejsca .

Jeśli masz Windows 10 i PowerShell 5, jest Clear-RecycleBinCommandlet .

Aby używać Clear-RecycleBinwewnątrz programu PowerShell bez potwierdzenia, możesz użyć Clear-RecycleBin -Force. Oficjalną dokumentację można znaleźć tutaj

Spróbuj tego
źródło
3
Wyczyść RecycleBin jest przydatne w PowerShell w Windows 10
Jin
Clear-RecycleBinpomyślnie usunąłem niektóre źle sformułowane nazwy folderów z kosza, których nie mogłem usunąć w inny sposób.
S. Tarık Çetin,
5

Aby potajemnie usunąć wszystko, spróbuj:

rd /s /q %systemdrive%\$Recycle.bin
Robie Nayak
źródło
5

Wiem, że trochę się spóźniłem na przyjęcie, ale pomyślałem, że mogę wnieść swój subiektywnie bardziej wdzięczne rozwiązanie.

Szukałem skryptu, który opróżniłby Kosz za pomocą wywołania API, zamiast brutalnie usuwać wszystkie pliki i foldery z systemu plików. Po niepowodzeniu w moich próbach RecycleBinObject.InvokeVerb("Empty Recycle &Bin")(które najwyraźniej działają tylko w XP lub starszych), natknąłem się na dyskusje o użyciu funkcji osadzonej w shell32.dll wywołanej SHEmptyRecycleBin()z języka kompilowanego. Pomyślałem, hej, mogę to zrobić w PowerShell i owinąć to w hybrydę skryptów wsadowych.

Zapisz to z rozszerzeniem .bat i uruchom, aby opróżnić Kosz. Uruchom go /yprzełącznikiem, aby pominąć potwierdzenie.

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

Oto bardziej złożona wersja, która najpierw wywołuje, SHQueryRecycleBin()aby określić, czy pojemnik jest już pusty przed wywołaniem SHEmptyRecycleBin(). W tym przypadku pozbyłem się choicepotwierdzenia i /yprzełącznika.

<# : 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
rojo
źródło
Bardzo dobra poprawa techniki batch / powershell chimera (+1). Czy to iex-ing to twój pomysł? (btw jest to możliwe do osadzenia kodu C # w pliku wsadowego z zadań msbuild inline bez konieczności sporządzania EXE)
npocmaka
@npocmaka Thanks! Myślę, że wielu innych skorzystało z iextego sposobu. Zapomniałem, gdzie odebrałem, to ${%~f0}jest równoważne gc "%~f0". To ten kot zmienił mnie w out-string. Czy możesz połączyć przykład osadzania C # w skrypcie wsadowym za pomocą msbuild? Mój Google-fu jest dziś słaby.
rojo
1
tutaj - dostips.com/forum/… - chociaż nie możesz bezpośrednio przekazywać argumentów wiersza poleceń - musisz zdefiniować zmienną z argumentami, które później można wyodrębnić z części c #
npocmaka
aw powyższym przykładzie wersja .net nie jest sparametryzowana.
npocmaka,
4

podczas

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

usunie folder $ RECYCLE.BIN z dysku systemowego, którym zwykle jest c :, należy rozważyć usunięcie go z innych dostępnych partycji, ponieważ na każdej partycji na dyskach lokalnych i zewnętrznych (ale nie na dyski wymienne, takie jak pendrive'y, które nie mają folderu $ RECYCLE.BIN). Na przykład zainstalowałem program w d :, aby usunąć pliki, które przeniósł się do Kosza, powinienem uruchomić:

rd / s /qd:\$RECYCLE.BIN

Więcej informacji można znaleźć w Super User pod adresem Empty recycling bin z wiersza poleceń

Oz Edri
źródło
Ahhhh Próbowałem dowiedzieć się, dlaczego powyższe sugerowane polecenia nie działają. Określenie f: dla mojego sprawiło, że zadziałało. Wielkie dzięki! <3
Phill
4

Używam tego onelinera PowerShell:

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

Działa również na innych dyskach niż C :.

rko281
źródło
3

Używam tych poleceń w pliku wsadowym, aby opróżnić kosz:

del /q /s %systemdrive%\$Recycle.bin\*
for /d %%x in (%systemdrive%\$Recycle.bin\*) do @rd /s /q "%%x"
pardeew
źródło
2

Tak, możesz utworzyć plik wsadowy za pomocą następującego kodu:

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

Zasadniczo tworzy to skrypt PowerShell, który opróżnia kosz w katalogu \ Desktop, a następnie go uruchamia.

Zazman
źródło
0

Wszystkie odpowiedzi są zbyt skomplikowane. OP poprosił CMD o możliwość zrobienia tego.

Proszę bardzo (z pliku cmd):

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

I tak, zaktualizuje się w eksploratorze.

Twoja siostra
źródło
0

Utwórz plik cmd z linią:

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"
alexsupra
źródło
0

Możesz użyć tego polecenia programu PowerShell.

Clear-RecycleBin -Force

Uwaga : jeśli chcesz otrzymać monit o potwierdzenie, usuń flagę -Force

Mwiza
źródło