web-dev-qa-db-fra.com

comment vider recyclebin via une invite de commande?

Habituellement, nous supprimons le contenu de la corbeille en cliquant dessus avec le bouton droit de la souris et en sélectionnant "Vider la corbeille". Mais j'ai une exigence où je dois supprimer le contenu de la corbeille à l'aide de la commande Invite. Est-ce possible? Si oui, comment puis-je y parvenir?

74
user1016403

Vous pouvez effectivement "vider" la corbeille à partir de la ligne de commande en supprimant définitivement le répertoire de la corbeille sur le lecteur contenant les fichiers système. (Dans la plupart des cas, il s'agira du lecteur C:, mais vous ne devriez pas coder cette valeur en dur car elle ne sera pas toujours vraie. Utilisez plutôt la variable d'environnement %systemdrive%.)

La raison pour laquelle cette tactique fonctionne est parce que chaque lecteur a un dossier caché et protégé portant le nom $Recycle.bin, qui est l'endroit où la Corbeille stocke réellement les fichiers et les dossiers supprimés. Lorsque ce répertoire est supprimé, Windows crée automatiquement un nouveau répertoire.

Donc, pour supprimer le répertoire, utilisez la commande rd (r emove d irectory) avec le paramètre /s, qui indique que tous les fichiers et répertoires du répertoire spécifié doivent également être supprimés. :

rd /s %systemdrive%\$Recycle.bin

Notez que cette action supprimera définitivement tous les fichiers et dossiers actuellement dans la Corbeille de tous les comptes d’utilisateur . De plus, vous devrez (évidemment) exécuter la commande à partir d'une invite élevée de commande afin de disposer des privilèges suffisants pour effectuer cette action. 

81
Cody Gray

Je préfère recycle.exe de Frank P. Westlake . Il fournit un statut Nice avant et après. (J'utilise les divers utilitaires de Frank depuis plus de dix ans ..)

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.

Il a également beaucoup plus d'utilisations et d'options (la sortie listée est 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"
24
wasatchwizard

nircmd vous permet de le faire en tapant

nircmd.exe emptybin

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

13
Rahul

Vous pouvez utiliser un script PowerShell (cela fonctionne aussi pour les utilisateurs avec la redirection de dossiers pour ne pas que leurs corbeilles utilisent beaucoup d'espace de stockage sur le serveur)

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

Le script ci-dessus est tiré de ici .

Si vous avez Windows 10 et PowerShell 5, il existe le commandlet Clear-RecycleBin .

Pour utiliser Clear-RecycleBin initié PowerShell sans confirmation, vous pouvez utiliser Clear-RecycleBin -Force. Les documents officiels peuvent être trouvés ici

8
trythis

tandis que

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

supprimera le dossier $ RECYCLE.BIN du lecteur système, qui est généralement c:, On devrait envisager de le supprimer de toute autre partition disponible car il existe un dossier caché $ RECYCLE.BIN dans toute partition des lecteurs locaux et externes ( Par exemple, j'ai installé un programme dans d :, afin de supprimer les fichiers qu'il a déplacés vers la corbeille. Je devrais courir:

rd/s/q d:\$ RECYCLE.BIN

Plus d'informations disponibles sur Super User à Vider le bac de récupération à partir de la ligne de commande

4
Oz Edri

J'utilise cet oneliner powershell:

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

Fonctionne pour d'autres lecteurs que C :, aussi

3
rko281

Je sais que je suis un peu en retard à la fête, mais je pensais pouvoir apporter ma solution subjectivement plus gracieuse.

Je recherchais un script qui viderait la corbeille à l'aide d'un appel d'API, au lieu de supprimer grossièrement tous les fichiers et dossiers du système de fichiers. Ayant échoué dans mes tentatives de RecycleBinObject.InvokeVerb("Empty Recycle &Bin") (qui ne fonctionne apparemment que dans XP ou dans une version plus ancienne), je suis tombé par hasard sur l'utilisation d'une fonction intégrée à Shell32.dll appelée SHEmptyRecycleBin() depuis un langage compilé. Je me suis dit que je pouvais le faire dans PowerShell et l’envelopper dans un script batch hybride.

Enregistrez-le avec une extension .bat et exécutez-le pour vider votre corbeille. Exécutez-le avec un commutateur /y pour ignorer la confirmation.

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

Voici une version plus complexe qui appelle d’abord SHQueryRecycleBin() pour déterminer si la corbeille est déjà vide avant d’appeler SHEmptyRecycleBin() . Pour celui-ci, je me suis débarrassé de la confirmation choice et du commutateur /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
3
rojo

Pour tout effacer furtivement, essayez:

rd /s /q %systemdrive%\$Recycle.bin
3
Robie

j'utilise ces commandes dans un fichier batch pour vider la corbeille:

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

Oui, vous pouvez créer un fichier batch avec le code suivant:

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

Cela crée essentiellement un script PowerShell qui vide la corbeille dans le répertoire\Desktop, puis l'exécute.

1
Zazman

Toutes les réponses sont trop compliquées. OP a demandé un moyen de le faire à CMD.

Ici vous allez (à partir du fichier cmd):

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

Et oui, il sera mis à jour dans Explorer.

0
Your Sister