Empty Trash Programmatically Using Powershell

One of the hardest things I had to do was access the Windows API using PowerShell. I want to delete the trash using the API in Shell32.dll. There are other ways to do this, but they usually bypass regular Windows processes, in which case I want to do this in the “right” way.

+4
source share
2 answers

A few hours later I came up with this.

$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()
+3
source

How about this? Does reset allow permissions, works for all users and all drives. I tested it on 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
} 
0
source

Source: https://habr.com/ru/post/1535089/


All Articles