95 votes

comment vider la corbeille par l'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 besoin de supprimer le contenu de la corbeille en utilisant l'invite de commande. Cela est-il possible ? Si oui, comment puis-je le faire ?

2 votes

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

0 votes

Existe-t-il un moyen qui ne nécessite pas l'étape supplémentaire d'utiliser l'invite cmd de l'administrateur ? Ce n'est pas grave si cela ne concerne que mon compte, je n'utilise qu'un seul compte sur mon PC.

6voto

rko281 Points 69

J'utilise cet oneliner powershell :

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

Cela fonctionne aussi pour des lecteurs différents de C :.

5voto

rojo Points 3830

Je sais que j'arrive un peu tard dans la soirée, mais j'ai pensé que je pourrais apporter 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 de RecycleBinObject.InvokeVerb("Empty Recycle &Bin") (qui apparemment ne fonctionne que sous XP ou plus), je suis tombé sur des discussions concernant l'utilisation d'une fonction intégrée dans shell32.dll appelée SHEmptyRecycleBin() à partir d'un langage compilé. J'ai pensé, hey, je peux faire ça dans PowerShell et l'envelopper dans un lot script hybride.

Enregistrez ce fichier avec une extension .bat et exécutez-le pour vider votre corbeille. Exécutez-le avec une extension /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 invoque 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 choice confirmation et /y interrupteur.

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

0 votes

Très belle amélioration de la technique de la chimère par lot/powershell (+1). Est-ce que le iex -de votre idée ? (btw il est possible d'incorporer du code C# dans un fichier batch avec les tâches en ligne de msbuild sans avoir besoin de compiler l'exe)

0 votes

@npocmaka Merci ! Je pense que beaucoup d'autres personnes ont utilisé iex de cette façon. Je ne sais plus où j'ai trouvé ça. ${%~f0} est équivalent à gc "%~f0" . Il a été ce chat qui m'a fait découvrir out-string . Pouvez-vous lier un exemple d'incorporation de C# dans un lot script avec msbuild ? Mon Google-fu est faible aujourd'hui.

1 votes

Ici - dostips.com/forum/ - mais vous ne pouvez pas passer les arguments de la 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 tout supprimer furtivement, essayez :

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

4voto

Oz Edri Points 501

Tandis que

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

supprimera le dossier $RECYCLE.BIN du lecteur système, qui est généralement c :, il faut penser à le supprimer de toutes les autres partitions disponibles, car il existe un dossier $RECYCLE.BIN caché dans toutes les partitions 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, j'ai installé un programme dans 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 le site Super User à l'adresse Vider la poubelle de recyclage à partir de la ligne de commande

0 votes

Ahhhh j'ai essayé de comprendre pourquoi les commandes suggérées ci-dessus n'ont pas fonctionné. En spécifiant f : pour le mien, ça a marché. 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.

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