मुझे पता है कि मुझे पार्टी में थोड़ी देर हो गई है, लेकिन मुझे लगा कि मैं अपने विषय को और अधिक सुंदर समाधान में योगदान दे सकता हूं।
मैं एक ऐसी स्क्रिप्ट की तलाश कर रहा था, जो फाइल सिस्टम से सभी फाइलों और फ़ोल्डरों को क्रूडली डिलीट करने के बजाय एक रीसायकल बिन को एपीआई कॉल से खाली कर दे। मेरे प्रयासों में विफल होने के बाद RecycleBinObject.InvokeVerb("Empty Recycle &Bin")
(जो कि जाहिरा तौर पर केवल XP या पुराने में काम करता है), मैं SHEmptyRecycleBin()
एक संकलित भाषा से कॉल किए गए shell32.dll में एम्बेडेड फ़ंक्शन का उपयोग करने की चर्चा पर ठोकर खाई । मैंने सोचा, अरे, मैं ऐसा कर सकता हूं पावरशेल में और इसे एक बैच स्क्रिप्ट हाइब्रिड में लपेटता हूं।
इसे .bat एक्सटेंशन के साथ सेव करें और इसे अपने रीसायकल बिन को खाली करने के लिए चलाएं। /y
पुष्टि छोड़ने के लिए इसे एक स्विच के साथ चलाएं ।
<
:: 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
यहां एक अधिक जटिल संस्करण है जो पहले SHQueryRecycleBin()
यह निर्धारित करने के लिए आह्वान करता है कि क्या बिन पहले से ही खाली है SHEmptyRecycleBin()
। इस एक के लिए, मुझे choice
पुष्टि और /y
स्विच से छुटकारा मिल गया ।
<
:: 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