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