windows - cómo vaciar recyclebin a través del símbolo del sistema?
windows-7 command-line (10)
Por lo general, eliminamos el contenido de la papelera de reciclaje haciendo clic con el botón derecho del mouse y seleccionando "Vaciar papelera de reciclaje". Pero tengo un requisito donde necesito eliminar el contenido de la papelera de reciclaje usando el símbolo del sistema. es posible? Si es así, ¿cómo puedo lograrlo?
Para eliminar sigilosamente todo, intente:
rd /s /q %systemdrive%/$Recycle.bin
Prefiero recycle.exe
de Frank P. Westlake . Proporciona un buen estado de antes y después. (He estado usando varias 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 (el resultado listado 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"
Sé que llegué 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 API, en lugar de eliminar toscamente todos los archivos y carpetas del sistema de archivos. Después de haber fallado en mis intentos de RecycleBinObject.InvokeVerb("Empty Recycle &Bin")
(que aparentemente solo funciona en XP o anterior), tropecé con discusiones sobre el uso de una función incrustada en shell32.dll llamada SHEmptyRecycleBin()
desde un lenguaje compilado. Pensé, hey, puedo hacer eso en PowerShell y envolverlo en un script por lotes híbrido.
Guarde esto con una extensión .bat y ejecútelo para vaciar su Papelera de reciclaje. Ejecútelo con un interruptor /y
para omitir la confirmación.
<# : batch portion (begins PowerShell multi-line comment block)
:: empty.bat -- http://.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 primero invoca SHQueryRecycleBin()
para determinar si el contenedor ya está vacío antes de invocar a SHEmptyRecycleBin()
. Para este, me deshice de la confirmación de choice
y /y
cambio.
<# : batch portion (begins PowerShell multi-line comment block)
:: empty.bat -- http://.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
Sí, puede hacer 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 powershell que vacía la basura en el directorio / Desktop y luego la ejecuta.
Yo uso este Powershell oneliner:
gci C:/`$recycle.bin -force | remove-item -recurse -force
Funciona para diferentes unidades que C :, también
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 una unidad 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 que debería ejecutar:
rd / s /qd:/$RECYCLE.BIN
Más información disponible en Super User at Empty reciclaje bin from command line
utilice un script powershell (esto funciona para los usuarios con redirección de carpetas y para que sus contenedores de reciclaje no ocupen el espacio de almacenamiento del servidor)
$Shell = New-Object -ComObject Shell.Application
$RecBin = $Shell.Namespace(0xA)
$RecBin.Items() | %{Remove-Item $_.Path -Recurse -Confirm:$false}
tomado de http://aramblinggeek.com/powershell-empty-recycle-bin
o si tiene Windows 10 y PowerShell 5, existe el comando clear-recyclebin https://blogs.technet.microsoft.com/heyscriptingguy/2015/08/04/powertip-use-powershell-5-to-clear-recycle-bin/
utilizo 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"
nircmd te permite hacer eso escribiendo
nircmd.exe emptybin
http://www.nirsoft.net/utils/nircmd-x64.zip
http://www.nirsoft.net/utils/nircmd.html
Puede "vaciar" efectivamente la Papelera de reciclaje desde la línea de comando 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 unidad C:
, pero no debe codificar ese valor porque no siempre será cierto. En su lugar, use la variable de entorno %systemdrive%
).
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.
Por lo tanto, para eliminar el directorio, use el comando rd
( r emove d irectory) con el parámetro /s
, 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, deberá (obviamente) ejecutar el comando desde un símbolo del sistema elevado para tener suficientes privilegios para realizar esta acción.