Очистить корзину программно с помощью Powershell
Одна из самых сложных вещей, которые мне приходилось делать, - это доступ к Windows API с помощью PowerShell. Я хочу стереть корзину с помощью API в Shell32.dll. Есть и другие способы сделать это, но они обычно обходят обычные процессы Windows, и в этом случае я хочу сделать это "правильным" способом.
2 ответа
Решение
Через несколько часов я придумал это.
$TypeDefinition=@"
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
namespace shell32 {
//Put all the variables required for the DLLImports here
enum RecycleFlags : uint { SHERB_NOCONFIRMATION = 0x00000001, SHERB_NOPROGRESSUI = 0x00000002, SHERB_NOSOUND = 0x00000004 }
public static class RecycleBin {
[DllImport("Shell32.dll",CharSet=CharSet.Unicode)]
internal static extern uint SHEmptyRecycleBin(IntPtr hwnd, string pszRootPath, RecycleFlags dwFlags);
}
public class ShellWrapper : IDisposable {
// Creates a new wrapper for the local machine
public ShellWrapper() { }
// Disposes of this wrapper
public void Dispose() {
GC.SuppressFinalize(this);
}
//Put public function here
public uint Empty() {
uint ret = RecycleBin.SHEmptyRecycleBin(IntPtr.Zero, null, RecycleFlags.SHERB_NOCONFIRMATION | RecycleFlags.SHERB_NOPROGRESSUI | RecycleFlags.SHERB_NOSOUND);
return ret;
}
// Occurs on destruction of the Wrapper
~ShellWrapper() {
Dispose();
}
} //Wrapper class
}
"@
Add-Type -TypeDefinition $TypeDefinition -PassThru | out-null
$RecycleBin=new-object Shell32.ShellWrapper
$RecycleBin.Empty()
Как насчет этого? Не сбрасывает никаких разрешений, работает для всех пользователей и на всех дисках. Я проверял это на 2012 R2+
$dis = gwmi Win32_LogicalDisk -Filter 'DriveType=3' | select -ExpandProperty DeviceID
$rec = @()
foreach ($d in $dis)
{
$rec += gci "$d\`$Recycle.Bin" -Force
}
foreach ($r in $rec)
{
gci $r.FullName -Force -Recurse | rm -Force -Confirm:$false
}