Wie kann man den Papierkorb über die Eingabeaufforderung leeren?

80

Normalerweise löschen wir den Inhalt des Papierkorbs, indem wir mit der rechten Maustaste darauf klicken und "Papierkorb leeren" auswählen. Ich habe jedoch eine Anforderung, bei der ich den Inhalt des Papierkorbs über die Eingabeaufforderung löschen muss. Ist das möglich? Wenn ja, wie kann ich das erreichen?

user1016403
quelle
2
Ich habe Windows die ältesten Dateien automatisch löschen lassen, wenn der Papierkorb seine maximale Größe erreicht hat. Superuser.com/questions/69284/…
Matthew Lock
Gibt es eine Möglichkeit, die nicht den zusätzlichen Schritt der Verwendung der Eingabeaufforderung admin cmd erfordert? Es ist in Ordnung, wenn es nur mein Konto tut, ich benutze nur ein Konto auf meinem PC.
user742864

Antworten:

91

Sie können den Papierkorb effektiv über die Befehlszeile "leeren", indem Sie das Papierkorbverzeichnis auf dem Laufwerk, das die Systemdateien enthält, dauerhaft löschen. (In den meisten Fällen ist dies das C:Laufwerk, aber Sie sollten diesen Wert nicht fest codieren, da er nicht immer wahr ist. Verwenden Sie stattdessen die %systemdrive%Umgebungsvariable.)

Der Grund, warum diese Taktik funktioniert, liegt darin, dass jedes Laufwerk einen versteckten, geschützten Ordner mit dem Namen hat $Recycle.bin, in dem der Papierkorb die gelöschten Dateien und Ordner tatsächlich speichert. Wenn dieses Verzeichnis gelöscht wird, erstellt Windows automatisch ein neues Verzeichnis.

Also, um das Verzeichnis zu entfernen, verwenden Sie den rdBefehl ( r emove d irectory) mit dem /sParameter, der angibt , dass alle Dateien und Verzeichnisse im angegebenen Verzeichnis als auch entfernt werden sollte:

rd /s %systemdrive%\$Recycle.bin

Beachten Sie, dass durch diese Aktion alle Dateien und Ordner, die sich derzeit im Papierkorb befinden, dauerhaft aus allen Benutzerkonten gelöscht werden . Außerdem müssen Sie den Befehl (offensichtlich) an einer Eingabeaufforderung mit erhöhten Rechten ausführen, um über ausreichende Berechtigungen zum Ausführen dieser Aktion zu verfügen.

Cody Grey
quelle
17
Noch ein paar Vorsichtsmaßnahmen: Die Änderung des Bin-Status wird möglicherweise nicht im Explorer (dem Desktop-Symbol) angezeigt, bis Sie den Papierkorb tatsächlich öffnen und / oder den Desktop aktualisieren. Sie wirkt sich nur auf dieses bestimmte Volume aus. Recycling - Dateien auf andere Laufwerke werden nicht betroffen sein, so dass man eigentlich nicht sein kann Entleeren des Papierkorbs mit dieser Methode, und der Verzeichnisname von Windows - Version unterschiedlich sein kann (und ich glaube , Dateisystem als auch). Es kann sein $Recycle.bin, Recycled, Recycleretc. und Sie können sogar mehr als ein, wenn Sie Multi-Boot-Programme wie Norton Recovery Bin ihre eigenen Verzeichnisse haben.
Synetech
1
@Synetech, Wie wir herausfinden wird $Recycle.bin, Recycledoder Recycler? Gibt es eine Variable, um dies zu tun, oder ist der einzige Weg, die Ausnahmen abzufangen?
Pacerier
3
Hinweis: Wenn Sie dies in einem Skript verwenden, möchten Sie auch einen /qSchalter übergeben, damit rdSie keine zusätzliche Eingabeaufforderung erhalten. rd /s /q %SYSTEMDRIVE%\$Recycle.bin
James Ko
Funktioniert nicht unter Windows 10. Nach Verwendung dieses Befehls passiert nichts.
JDHAO
1
Erinnerung, dies funktioniert nur in CMD. Wenn Sie möchten, dass es in Powershell ausgeführt wird, versuchen Sie es cmd /c "rd /s %systemdrive%\$Recycle.bin"
Arcsector
28

Ich bevorzuge recycle.exevon Frank P. Westlake . Es bietet einen schönen Vorher-Nachher-Status. (Ich benutze Franks verschiedene Dienstprogramme seit mehr als zehn Jahren.)

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.

Es hat auch viel mehr Verwendungen und Optionen (die aufgelistete Ausgabe stammt von /?).

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
quelle
Hat dies nicht das gleiche Problem, das Synetech erwähnt hat? stackoverflow.com/questions/9238953/…
Pacerier
1
@Pacerier Ich zeige den Papierkorb nicht auf meinem Desktop an, daher habe ich noch nie bemerkt, ob das Symbol aktualisiert wird oder nicht. Nach nur es zu testen, das Symbol wird nach der Entleerung über recycle.exe korrekt aktualisiert. In Bezug auf die Verzeichnisse erwarte ich, dass eine Win32-API zum Leeren des Papierkorbs verwendet wird. Trotzdem verwende ich dieses Dienstprogramm seit vielen Jahren unter Windows, einschließlich XP, 7, 8, 8.1 und Server 2003, 2012, 2012 R2. (Ich habe es wahrscheinlich unter Vista und Server 2008 verwendet, aber diese Betriebssysteme nicht sehr lange ausgeführt, daher kann ich nicht sicher sagen ..)
kodybrown
1
Ja, es ist kein besonders nützliches Tool, zumal es bereits integrierte Möglichkeiten gibt, dies zu tun.
Pacerier
2
@ Pacerier auf verschiedene Arten gebaut!? Möchten Sie mit der Tastatur und / oder Maus im Windows Explorer navigieren? Verwenden Sie das Symbol auf dem Desktop (vorausgesetzt, der Papierkorb wird sogar auf dem Desktop angezeigt)? Keiner von beiden löst die Frage der Operation. Ich glaube wirklich, dass es irgendwo einen Befehl zum Leeren des Papierkorbs gibt, wie zum Beispiel das Löschen des Verlaufs, RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 1aber ich habe ihn nicht gefunden. Also, bitte, wenn Sie einen eingebauten Weg haben, teilen Sie ihn bitte!
Kodybrown
1
@Pacerier: Zuerst schlagen Sie vor, dass diese Lösung Fehler wie die RD /S [/Q]Lösung aufweist, die @wasatchwizard durch Tests widerlegt hat. Dann ist genau dieselbe RD /S [/Q]Lösung plötzlich überlegen, weil sie "eingebaut" ist. Wie macht das Sinn? RD /S [/Q]hat die Probleme @Synetech beschrieben. Diese Lösung funktioniert nicht.
zb226
11

Sie können ein Powershell-Skript verwenden (dies funktioniert auch für Benutzer mit Ordnerumleitung, damit ihre Papierkörbe keinen Serverspeicherplatz belegen).

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

Das obige Skript stammt von hier .

Wenn Sie Windows 10 und Powershell 5 haben, gibt es das Clear-RecycleBinCommandlet .

So verwenden Sie Clear-RecycleBininnerhalb Powershell ohne Bestätigung, können Sie verwenden Clear-RecycleBin -Force. Offizielle Unterlagen finden Sie hier

Versuche dies
quelle
3
Clear RecycleBin ist nützlich in PowerShell in Windows 10
Jin
Clear-RecycleBinEinige fehlerhafte Ordnernamen im Papierkorb wurden erfolgreich gelöscht, die ich sonst nicht entfernen konnte.
S. Tarık Çetin
5

Versuchen Sie Folgendes, um alles heimlich zu entfernen:

rd /s /q %systemdrive%\$Recycle.bin
Robie Nayak
quelle
5

Ich weiß, dass ich etwas spät zur Party komme, aber ich dachte, ich könnte meine subjektiv anmutigere Lösung einbringen.

Ich suchte nach einem Skript, das den Papierkorb mit einem API-Aufruf leert, anstatt alle Dateien und Ordner grob aus dem Dateisystem zu löschen. Nachdem meine Versuche fehlgeschlagen waren RecycleBinObject.InvokeVerb("Empty Recycle &Bin")(was anscheinend nur unter XP oder älter funktioniert), stieß ich auf Diskussionen über die Verwendung einer in shell32.dll eingebetteten Funktion, die SHEmptyRecycleBin()aus einer kompilierten Sprache aufgerufen wurde . Ich dachte, hey, ich kann das in PowerShell tun und es in einen Batch-Skript-Hybrid einbinden.

Speichern Sie dies mit der Erweiterung .bat und führen Sie es aus, um den Papierkorb zu leeren. Führen Sie es mit einem /ySchalter aus, um die Bestätigung zu überspringen.

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

Hier ist eine komplexere Version, die zuerst aufgerufen wird, SHQueryRecycleBin()um festzustellen, ob der Behälter vor dem Aufrufen bereits leer ist SHEmptyRecycleBin(). In diesem Fall habe ich die choiceBestätigung und den /yWechsel entfernt.

<# : 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
quelle
Sehr schöne Verbesserung der Batch / Powershell-Chimärentechnik (+1). Ist das iex-ing deine Idee? (Übrigens ist es möglich, C # -Code mit msbuild Inline-Tasks in eine Batch-Datei einzubetten, ohne exe kompilieren zu müssen)
npocmaka
@npocmaka Danke! Ich denke, viele andere haben iexdiesen Weg benutzt. Ich vergesse, wo ich abgeholt habe, das ${%~f0}entspricht gc "%~f0". Es war diese Katze, die mich anmachte out-string. Können Sie ein Beispiel für die Einbettung von C # in ein Batch-Skript mit msbuild verknüpfen? Mein Google-Fu ist heute schwach.
Rojo
1
hier - dostips.com/forum/… - obwohl Sie keine Befehlszeilenargumente direkt übergeben können - müssen Sie eine Variable mit den Argumenten definieren, die später aus dem c #
-Teil
und im obigen Beispiel ist die .net-Version nicht parametrisiert.
Npocmaka
4

während

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

löscht den Ordner $ RECYCLE.BIN vom Systemlaufwerk, was normalerweise c: ist. Man sollte in Betracht ziehen, ihn von anderen verfügbaren Partitionen zu löschen, da sich in jeder Partition auf lokalen und externen Laufwerken ein versteckter Ordner $ RECYCLE.BIN befindet (jedoch nicht in Wechseldatenträger wie USB-Sticks ohne Ordner $ RECYCLE.BIN). Zum Beispiel habe ich ein Programm in d: installiert, um die Dateien zu löschen, die in den Papierkorb verschoben wurden, den ich ausführen sollte:

rd / s /qd:\$RECYCLE.BIN

Weitere Informationen finden Sie unter Super User unter Leerer Papierkorb über die Befehlszeile

Oz Edri
quelle
Ahhhh Ich habe versucht herauszufinden, warum die oben vorgeschlagenen Befehle nicht funktionierten. Die Angabe von f: für meine hat funktioniert. Danke vielmals! <3
Phill
4

Ich benutze diesen Powershell-Oneliner:

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

Funktioniert auch für andere Laufwerke als C:

rko281
quelle
3

Ich benutze diese Befehle in einer Batch-Datei, um den Papierkorb zu leeren:

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

Ja, Sie können eine Batch-Datei mit dem folgenden Code erstellen:

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

Dadurch wird im Grunde ein Powershell-Skript erstellt, das den Papierkorb im Verzeichnis \ Desktop leert und dann ausführt.

Zazman
quelle
0

Alle Antworten sind viel zu kompliziert. OP hat CMD um eine Möglichkeit gebeten, dies zu tun.

Los geht's (aus der Cmd-Datei):

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

Und ja, es wird im Explorer aktualisiert.

Deine Schwester
quelle
0

Erstellen Sie eine Cmd-Datei mit Zeile:

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
quelle
0

Sie können diesen PowerShell-Befehl verwenden.

Clear-RecycleBin -Force

Hinweis : Wenn Sie eine Bestätigungsaufforderung wünschen, entfernen Sie das Flag -Force

Mwiza
quelle