¿Cómo vaciar la papelera de reciclaje a través del símbolo del sistema?

80

Por lo general, eliminamos el contenido de la papelera de reciclaje haciendo clic derecho con el mouse y seleccionando "Vaciar papelera de reciclaje". Pero tengo un requisito en el que necesito eliminar el contenido de la papelera de reciclaje usando el símbolo del sistema. es posible? Si es así, ¿cómo puedo lograrlo?

usuario1016403
fuente
2
Dejo que Windows elimine automáticamente los archivos más antiguos cuando la Papelera de reciclaje alcanza su tamaño máximo superuser.com/questions/69284/…
Matthew Lock
¿Hay alguna forma que no requiera el paso adicional de usar el indicador de cmd de administrador? Está bien si solo funciona con mi cuenta, solo uso una cuenta en mi PC.
user742864

Respuestas:

91

Puede "vaciar" eficazmente la Papelera de reciclaje desde la línea de comandos eliminando permanentemente el directorio de la Papelera de reciclaje en la unidad que contiene los archivos del sistema. (En la mayoría de los casos, esta será la C:unidad, pero no debe codificar ese valor porque no siempre será verdadero. En su lugar, use la %systemdrive%variable de entorno).

La razón por la que esta táctica funciona es porque cada unidad tiene una carpeta oculta y protegida con el nombre $Recycle.bin, que es donde la Papelera de reciclaje realmente almacena los archivos y carpetas eliminados. Cuando se elimina este directorio, Windows crea automáticamente un nuevo directorio.

Entonces, para eliminar el directorio, use el rdcomando ( r emove d irectory) con el /sparámetro, que indica que todos los archivos y directorios dentro del directorio especificado deben eliminarse también:

rd /s %systemdrive%\$Recycle.bin

Tenga en cuenta que esta acción eliminará permanentemente todos los archivos y carpetas que se encuentran actualmente en la Papelera de reciclaje de todas las cuentas de usuario . Además, (obviamente) tendrá que ejecutar el comando desde un símbolo del sistema elevado para tener suficientes privilegios para realizar esta acción.

Cody Grey
fuente
17
Algunas advertencias más: • es posible que el cambio en el estado de la papelera no se refleje en el Explorador (el icono del escritorio) hasta que usted abra la Papelera de reciclaje y / o actualice el escritorio, sólo afecta a ese volumen en particular; Los archivos reciclados en otras unidades no se verán afectados, por lo que es posible que no esté vaciando la papelera de reciclaje con este método, y el nombre del directorio puede variar según la versión de Windows (y creo que también el sistema de archivos). Puede ser $Recycle.bin, Recycled, Recycler, etc e incluso se puede tener más de una si multi-boot-programas como Norton Papelera de Recuperación tienen sus propios directorios.
Synetech
1
@Synetech, ¿cómo lo averiguamos? $Recycle.bin , Recycledo Recycler? ¿Hay una variable para hacer eso, o es la única forma de capturar las excepciones?
Pacerier
3
Nota: Si está usando esto en un script, también querrá pasar un /qinterruptor para que rdno le dé un mensaje adicional. rd /s /q %SYSTEMDRIVE%\$Recycle.bin
James Ko
No funciona en mi Windows 10. No sucede nada después de usar este comando.
jdhao
1
Recuerde que esto solo funciona en CMD. Si desea que se ejecute en powershell, intente cmd /c "rd /s %systemdrive%\$Recycle.bin"
Arcsector
29

Prefiero recycle.exede Frank P. Westlake . Proporciona un buen estado antes y después. (He estado usando las diversas utilidades de Frank durante más de diez años ...)

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.

También tiene muchos más usos y opciones (la salida de la lista es de /?).

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
fuente
¿No tiene esto el mismo problema que mencionó Synetech? stackoverflow.com/questions/9238953/…
Pacerier
1
@Pacerier No muestro la Papelera de reciclaje en mi escritorio, así que nunca antes me había dado cuenta de si el icono se actualizaba o no. Después de probarlo, el icono se actualiza correctamente después de vaciarlo a través de recycling.exe. En lo que respecta a los directorios, espero que esté utilizando una API Win32 para vaciar la Papelera de reciclaje. Dicho esto, he usado esta utilidad durante muchos años en Windows, incluidos XP, 7, 8, 8.1 y Server 2003, 2012, 2012 R2. (Probablemente lo usé en Vista y Server 2008, pero no ejecuté esos sistemas operativos por mucho tiempo, así que no puedo decirlo con certeza ...)
kodybrown
1
Sí, no es una herramienta particularmente útil, especialmente porque ya hay formas integradas de hacerlo.
Pacerier
2
@Pacerier construido de maneras !? ¿Te gusta navegar por el Explorador de Windows con el teclado y / o el mouse? ¿Usando el ícono en el escritorio (asumiendo que la papelera de reciclaje incluso se muestra en el escritorio)? Ninguno de los cuales resuelve la pregunta de la operación. Realmente creo que hay un comando en algún lugar para vaciar el contenedor, como eliminar el historial, RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 1pero no lo he encontrado. Entonces, por favor, si tiene una forma incorporada, ¡compártala!
kodybrown
1
@Pacerier: Primero sugieres que esta solución tiene fallas como la RD /S [/Q]solución, que @wasatchwizard refutó mediante pruebas, luego la misma RD /S [/Q]solución exacta de repente es superior, porque está "incorporada". ¿Cómo eso tiene sentido? RD /S [/Q]tiene los problemas descritos por @Synetech. Esta solución no lo hace.
zb226
11

Puede usar un script de PowerShell (esto también funciona para usuarios con redirección de carpetas para que sus papeleras de reciclaje no ocupen espacio de almacenamiento del servidor)

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

La secuencia de comandos anterior se tomó de aquí .

Si tiene Windows 10 y PowerShell 5, existe el Clear-RecycleBincomando commandlet .

Para usar Clear-RecycleBindentro de PowerShell sin confirmación, puede usar Clear-RecycleBin -Force. La documentación oficial se puede encontrar aquí

prueba esto
fuente
3
Clear RecycleBin es útil en PowerShell en Windows 10
Jin
Clear-RecycleBineliminé con éxito algunos nombres de carpetas con formato incorrecto en la papelera de reciclaje que no podría eliminar de otra manera.
S. Tarık Çetin
5

Para eliminar todo sigilosamente, intente:

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

Sé que llego un poco tarde a la fiesta, pero pensé que podría contribuir con mi solución subjetivamente más elegante.

Estaba buscando un script que vaciara la Papelera de reciclaje con una llamada a la API, en lugar de borrar todos los archivos y carpetas del sistema de archivos. Habiendo fallado en mis intentos RecycleBinObject.InvokeVerb("Empty Recycle &Bin")(que aparentemente solo funciona en XP o anterior), me topé con discusiones sobre el uso de una función incrustada en shell32.dll llamadaSHEmptyRecycleBin() desde un lenguaje compilado. Pensé, oye, puedo hacer eso en PowerShell y envolverlo en un script híbrido por lotes.

Guarde esto con una extensión .bat y ejecútelo para vaciar su Papelera de reciclaje. Ejecútelo con un /yinterruptor para omitir la confirmació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

Aquí hay una versión más compleja que invoca primero SHQueryRecycleBin()para determinar si el contenedor ya está vacío antes de la invocación SHEmptyRecycleBin(). Para este, me deshice de la choiceconfirmación y el /ycambio.

<# : 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
fuente
Muy buena mejora de la técnica de quimera por lotes / powershell (+1). ¿El iex-ing es tu idea? (por cierto, es posible incrustar código C # en un archivo por lotes con tareas en línea de msbuild sin necesidad de compilar un exe)
npocmaka
@npocmaka ¡Gracias! Creo que muchos otros lo han usado de iexesta manera. Olvidé dónde recogí que ${%~f0}es equivalente gc "%~f0". Fue este gato quien me atrajo out-string. ¿Puede vincular un ejemplo de incrustación de C # en un script por lotes con msbuild? Mi Google-fu es débil hoy.
rojo
1
aquí - dostips.com/forum/… - aunque no puede pasar argumentos de línea de comando directamente - deberá definir una variable con los argumentos que luego se pueden extraer de la parte c #
npocmaka
y en el ejemplo anterior, la versión .net no está parametrizada.
npocmaka
4

mientras

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

eliminará la carpeta $ RECYCLE.BIN de la unidad del sistema, que generalmente es c :, uno debería considerar eliminarla de cualquier otra partición disponible, ya que hay una carpeta $ RECYCLE.BIN oculta en cualquier partición en unidades locales y externas (pero no en unidades extraíbles, como unidades flash USB, que no tienen una carpeta $ RECYCLE.BIN). Por ejemplo, instalé un programa en d :, para eliminar los archivos que movió a la Papelera de reciclaje, debería ejecutar:

rd / s /qd:\$RECYCLE.BIN

Más información disponible en Superusuario en Vaciar papelera de reciclaje desde la línea de comandos

Oz Edri
fuente
Ahhhh He estado tratando de averiguar por qué los comandos sugeridos arriba no funcionaron. Especificar f: para el mío lo hizo funcionar. ¡Muchas gracias! <3
Phill
4

Yo uso este delineador de Powershell:

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

Funciona para diferentes unidades que C :, también

rko281
fuente
3

uso estos comandos en un archivo por lotes para vaciar la papelera de reciclaje:

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

Sí, puede crear un archivo por lotes con el siguiente código:

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

Esto básicamente crea un script de PowerShell que vacía la papelera en el directorio \ Desktop y luego lo ejecuta.

Zazman
fuente
0

Todas las respuestas son demasiado complicadas. OP solicitó una forma de hacer esto desde CMD.

Aquí tienes (del archivo cmd):

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

Y sí, se actualizará en el explorador.

Tu hermana
fuente
0

Crea un archivo cmd con la línea:

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

Puede usar este comando de PowerShell.

Clear-RecycleBin -Force

Nota : si desea un mensaje de confirmación, elimine el indicador -Force

Mwiza
fuente