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
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.