【问题标题】:Clear Recycle Bin programmatically with Powershell使用 Powershell 以编程方式清除回收站
【发布时间】:2014-05-17 06:52:22
【问题描述】:

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

【问题讨论】:

    标签: c# winapi powershell recycle-bin shell32.dll


    【解决方案1】:

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

    【讨论】:

    • 我们如何停止确认提示?
    【解决方案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()
    

    【讨论】:

    • 在 Windows 10 上运行或不运行提升对我不起作用。 2147549183 然后几次之后,它错误地说 shell32.RecycleFlags 已经存在。
    • @rjt,你能给我更多关于你系统的细节吗?我在 Windows 10 Enterprise x64 版本 1607 上对其进行了测试,没有域成员身份,它在提升的 PowerShell 会话中完美运行。
    • 域已加入。 Winver 1703 然后 1709?当我在机器上时会得到更多信息。
    • 它适用于我在加入域的机器上。但是,我在工作站上拥有管理员权限,即使我没有提升运行它。由于 Add-Type 语句,您不能在同一个 PowerShell 会话中运行它两次。
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 2021-12-10
    • 1970-01-01
    相关资源
    最近更新 更多