使用 Powershell 以编程方式清除回收站

本文关键字:清除 回收站 方式 编程 Powershell 使用 | 更新日期: 2023-09-27 17:56:48

我不得不做的最困难的事情之一就是使用PowerShell访问Windows API。 我想使用 Shell32.dll 中的 API 擦除回收站。 还有其他方法可以做到这一点,但它们通常会绕过正常的 Windows 进程,在这种情况下,我想以"正确"的方式做到这一点。

使用 Powershell 以编程方式清除回收站

几个小时后,我想出了这个。

$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
}