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

C# 使用Powershell以编程方式清除回收站,c#,winapi,powershell,recycle-bin,shell32.dll,C#,Winapi,Powershell,Recycle Bin,Shell32.dll,我必须做的最困难的事情之一是使用PowerShell访问Windows API。我想使用Shell32.dll中的API清除回收站。还有其他方法,但它们通常会绕过正常的Windows进程,在这种情况下,我想用“正确”的方法来做。几小时后,我想到了这个 $TypeDefinition=@" using System; using System.ComponentModel; using System.Runtime.InteropServices; namespace shell32 {

我必须做的最困难的事情之一是使用PowerShell访问Windows API。我想使用Shell32.dll中的API清除回收站。还有其他方法,但它们通常会绕过正常的Windows进程,在这种情况下,我想用“正确”的方法来做。几小时后,我想到了这个

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

在运行提升版或非提升版的windows 10上不适用于我。2147549183,几次之后,它错误地说shell32.RecycleFlags已经存在。@rjt,你能告诉我关于你的系统的更多细节吗?我在Windows10EnterpriseX64版本1607上测试了它,没有域成员资格,并且它在提升的PowerShell会话中工作得非常好。域已加入。Winver 1703然后1709?当我在计算机上时将获得更多信息。它在加入域的计算机上对我有效。但是,我在工作站上有管理员权限,即使我没有运行它。由于Add Type语句,无法在同一PowerShell会话中运行它两次。