95 votes

Comment vider la corbeille via l'invite de commandes?

Généralement, nous supprimons le contenu de la corbeille en cliquant dessus avec la souris et en sélectionnant "Vider la corbeille". Mais j'ai une exigence où je dois supprimer le contenu de la corbeille en utilisant l'invite de commandes. Est-ce possible? Si oui, comment puis-je y parvenir?

2 votes

Je laisse simplement Windows supprimer automatiquement les fichiers les plus anciens lorsque la Corbeille atteint sa taille maximale superuser.com/questions/69284/…

0 votes

Y a-t-il un moyen qui ne nécessite pas l'étape supplémentaire de l'utilisation de l'invite de commande admin? C'est okay si cela ne concerne que mon compte, je n'utilise qu'un seul compte sur mon PC.

6voto

rko281 Points 69

J'utilise ce oneliner powershell :

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

Fonctionne également pour des lecteurs autres que C:

5voto

rojo Points 3830

Je sais que je suis un peu en retard pour la fête, mais j'ai pensé que je pourrais contribuer ma solution subjectivement plus gracieuse.

Je cherchais un script qui viderait la Corbeille avec un appel API, plutôt que de supprimer grossièrement tous les fichiers et dossiers du système de fichiers. Ayant échoué dans mes tentatives d'appel à RecycleBinObject.InvokeVerb("Empty Recycle &Bin") (qui apparemment ne fonctionne que dans XP ou plus ancien), je suis tombé sur des discussions sur l'utilisation d'une fonction intégrée dans shell32.dll appelée SHEmptyRecycleBin() depuis un langage compilé. J'ai pensé, hé, je peux le faire en PowerShell et l'envelopper dans un script batch hybride.

Enregistrez ceci 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 (commence un bloc de commentaire multiligne PowerShell)
:: empty.bat -- http://stackoverflow.com/a/41195176/1683264

@echo off & setlocal

if /i "%~1"=="/y" goto empty

choice /n /m "Êtes-vous sûr de vouloir vider la Corbeille ? [o/n] "
if not errorlevel 2 goto empty
goto :EOF

:empty
powershell -noprofile "iex (${%~f0} | out-string)" && (
    echo Corbeille vidée avec succès.
)
goto :EOF

: fin batch / début hybride PowerShell chimère #>
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) { "Erreur 0x{0:x8} : {1}" -f $res,`
    (New-Object ComponentModel.Win32Exception($res)).Message }
exit $res

Voici une version plus complexe qui commence par invoquer SHQueryRecycleBin() pour déterminer si la corbeille est déjà vide avant d'invoquer SHEmptyRecycleBin(). Pour celle-ci, j'ai supprimé la confirmation choice et le commutateur /y.

<# : batch portion (commence un bloc de commentaire multiligne PowerShell)
:: empty.bat -- http://stackoverflow.com/a/41195176/1683264

@echo off & setlocal
powershell -noprofile "iex (${%~f0} | out-string)"
goto :EOF

: fin batch / début hybride PowerShell chimère #>
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

# pour Win 10 / PowerShell v5
try { $rb.cbSize = [Runtime.InteropServices.Marshal]::SizeOf($rb) }
# pour Win 7 / PowerShell v2
catch { $rb.cbSize = [Runtime.InteropServices.Marshal]::SizeOf($rb.GetType()) }

[void][shell32.dll]::SHQueryRecycleBin($null, [ref]$rb)
"Taille actuelle de la Corbeille : {0:N0} octets" -f $rb.i64Size
"La Corbeille contient {0:N0} élément{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 ("Erreur 0x{0:x8} : {1}" -f $res,`
        (New-Object ComponentModel.Win32Exception($res)).Message)
} else {
    write-host "Corbeille vidée avec succès." -f green
}
exit $res

0 votes

Très belle amélioration de la technique de chimère batch/powershell (+1). Est-ce que le iex est ton idée? (au fait il est possible d'intégrer du code C# dans un fichier batch avec les tâches inline msbuild sans besoin de compiler un exe)

0 votes

@npocmaka Merci! Je pense que beaucoup d'autres ont utilisé iex de cette manière. J'oublie où j'ai appris que ${%~f0} est équivalent à gc "%~f0". C'était ce chat qui m'a fait découvrir out-string. Pouvez-vous me donner un exemple d'intégration de C# dans un script batch avec msbuild? Ma Google-fu est faible aujourd'hui.

1 votes

Ici - dostips.com/forum/… - bien que vous ne puissiez pas passer d'arguments en ligne de commande directement - vous devrez définir une variable avec les arguments qui pourront ensuite être extraits de la partie C#

5voto

ravi06 Points 87

Pour supprimer discrètement tout, essayez :

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

4voto

Oz Edri Points 501

Pendant que

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

supprimera le dossier $RECYCLE.BIN du lecteur système, qui est généralement le c:, il est conseillé de le supprimer également des autres partitions disponibles car il y a un dossier $RECYCLE.BIN caché dans chaque partition des disques locaux et externes (mais pas dans les disques amovibles, comme les clés USB, qui n'ont pas de dossier $RECYCLE.BIN). Par exemple, si j'ai installé un programme dans le d:, pour supprimer les fichiers qu'il a déplacés dans la Corbeille, je dois exécuter :

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

Plus d'informations disponibles sur Super User à Vider la corbeille à partir de la ligne de commande

0 votes

Ahhhh, j'ai essayé de comprendre pourquoi les commandes suggérées ci-dessus ne fonctionnaient pas. Spécifier f: pour la mienne a permis que cela fonctionne. Merci beaucoup! <3

3voto

pardeew Points 31

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"

0 votes

Win 10 n'a pas de répertoire %systemdrive%\$Recycle.bin

0 votes

@Zimba bien sûr que non. tout le monde ici invente juste des choses qui ont l'air cool.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X