使用PowerShell编程方式清空回收站

4

我所面临的最难的事情之一是使用PowerShell访问Windows API。我想使用Shell32.dll中的API来清空回收站。有其他方法可以实现,但它们通常会绕过正常的Windows进程,在这种情况下,我希望按照“正确”的方式来完成。

2个回答

4
几个小时后,我想到了这个。
$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()

在我的 Windows 10 上无论是以管理员身份运行还是不运行,都无法使用。2147549183 然后经过几次之后,它会出现错误,说 shell32.RecycleFlags 已经存在。 - rjt
@rjt,你能给我关于你的系统更多的细节吗?我在Windows 10 Enterprise x64 Version 1607上进行了测试,没有域成员,并且在提升的PowerShell会话中完美地运行。 - Slogmeister Extraordinaire
域加入。Winver 1703然后是1709?我在机器上时会获取更多信息。 - rjt
它在我的域加入机器上运行良好。但是,尽管我没有以提升的身份运行它,但我在工作站上拥有管理员特权。由于Add-Type语句的存在,您无法在同一PowerShell会话中运行两次。 - Slogmeister Extraordinaire

0
这个怎么样?不会重置任何权限,适用于所有用户和所有驱动器。我在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
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接