DiskCleanup.ps1

something exciting

Some information about the exciting thing

Table of contents generated with markdown-toc


Script

<#

.SYNOPSIS
Cleans up filesystem of common large and temporary files.

.DESCRIPTION
Cleans up filesystem of common large and temporary files.

.NOTES


#>
param ([switch]$componentcleanup)

Function Get-FreeSpace {
    param (
        $Driveletter,
        [ValidateSet("KB", "MB", "GB")]$unit
    )
    $size = (Get-WmiObject win32_logicaldisk | Where-Object { $_.DeviceID -eq ("$Driveletter" + ":") }).Freespace / '{0}' -f ("1" + $unit)
    Return ('{0:N2}' -f $size)
}


Function Remove-WindowsTempFiles {
    #Cleanup Windows Temp
    try {
        Remove-Item -Recurse $env:systemdrive\Windows\Temp\* -Confirm:$false -ErrorAction SilentlyContinue
    }
    catch [System.IO.IOException] {}
    try {
        #Cleanup windows logs
        Get-Process -Name TrustedInstaller -ErrorAction SilentlyContinue | Stop-Process -Confirm:$false -Force -ErrorAction SilentlyContinue
        Remove-Item -recurse $env:systemdrive\Windows\logs\* -Confirm:$false -Force -ErrorAction SilentlyContinue
        while ((Get-Service TrustedInstaller).Status -ne "Running") {
            Start-Service TrustedInstaller
        }

    }
    catch [System.IO.IOException] {}
}

Function Get-UserProfiles {
    (Get-WMIObject Win32_UserProfile | Where-Object { $_.localpath -notlike "*systemprofile" -and $_.localpath -notlike "*Administrator" -and $_.localpath -notlike "*NetworkService" -and $_.localpath -notlike "*LocalService" -and $_.localpath -notlike "*$env:USERNAME" -and $_.loaded -eq $false })
}
if (!((get-host).Version).Major -gt 4) {
    "requires powershell v4 or higher"
    exit
}

#Cleanup User Profiles
Function Remove-UserProfiles {
    while ((Get-UserProfiles).count -gt 0) {
        try {
            (Get-WMIObject Win32_UserProfile | Where-Object { $_.localpath -notlike "*systemprofile" -and $_.localpath -notlike "*Administrator" -and $_.localpath -notlike "*NetworkService" -and $_.localpath -notlike "*LocalService" -and $_.localpath -notlike "*$env:USERNAME" -and $_.loaded -eq $false }).delete()
        }
        Catch [System.Management.Automation.MethodInvocationException] {
            break
        }
    }
}

#Clean Recycle Bin
Function Clear-RecycleBin {
    $Recycler = (New-Object -ComObject Shell.Application).NameSpace(0xa)
    $Recycler.items() | ForEach-Object { Remove-Item $_.path -force -Recurse }
}

#Clean IIS Logs
function Clear-IISLogs {
    try {
        Get-ChildItem -Recurse 'C:\inetpub\logs' -ErrorAction stop | Where-Object { $_.Name -like "u_ex*" } | Remove-Item -Force -ErrorAction SilentlyContinue
    }
    catch [System.IO.IOException] {
    }
    catch [System.Management.Automation.ItemNotFoundException] {
    }
}

function Clear-ErrorReports {
    try {
        Get-Item $env:windir\Memory.dmp -ErrorAction stop | Remove-Item -force
    }
    catch [System.Management.Automation.ItemNotFoundException] {

    }

    try {
        Get-childitem $env:ALLUSERSPROFILE\Microsoft\Windows\WER\ | Remove-Item -recurse -force
    }
    catch [System.IO.IOException] {
    }

}

function Component-Cleanup {
    $OS = (Get-WmiObject Win32_OperatingSystem).Caption
    switch -Wildcard ($OS) {
        "*2012*" {
            dism.exe /online /Cleanup-Image /StartComponentCleanup
        }
        "*2008 R2*" {
            if (!(Test-Path 'C:\windows\system32\cleanmgr.exe') -or (Test-Path C:\windows\system32\en-us\cleanmgr.exe.mui)) {
                Copy-Item 'C:\Windows\winsxs\amd64_microsoft-windows-cleanmgr_31bf3856ad364e35_6.1.7600.16385_none_c9392808773cd7da\cleanmgr.exe' 'C:\windows\system32\cleanmgr.exe' -Force -Confirm:$false
                Copy-Item 'C:\Windows\winsxs\amd64_microsoft-windows-cleanmgr.resources_31bf3856ad364e35_6.1.7600.16385_en-us_b9cb6194b257cc63\cleanmgr.exe.mui' 'C:\windows\system32\en-us\cleanmgr.exe.mui' -Force -Confirm:$false
            }
            Start-Process -FilePath "cleanmgr.exe" -ArgumentList "/verylowdisk" -Wait
        }
    }

}

function Clear-FontCache {
    $fontfiles = Get-ChildItem "$($env:systemdrive)\Windows\ServiceProfiles\LocalService\AppData\Local" -Recurse -Filter "*FontCache*"
    $fontfiles | ForEach-Object {
        $acl = Get-Acl $_.FullName
        $permission = "$($env:username)", "FullControl", "Allow"
        $accessrule = New-Object system.security.accesscontrol.filesystemaccessrule $permission
        $acl.AddAccessRule($accessrule)
        $acl | Set-Acl $_.FullName -ErrorAction SilentlyContinue
    }
    Stop-Service "BITS"
    Stop-Service "FontCache"
    Stop-Service "SENS" -Force
    Stop-Service "COMSysApp"
    Stop-Service "EventSystem" -Force
    Remove-Item "$($env:systemdrive)\Windows\ServiceProfiles\LocalService\AppData\Local\*.dat" -Force -Confirm:$false -ErrorAction SilentlyContinue
    Start-Service "EventSystem"
    Start-Service "BITS"
    Start-Service "FontCache"
    Start-Service "SENS"
    Start-Service "COMSysApp"
}

function Clear-CCMCache {
    $ccmfolders = Get-Childitem "$($env:systemroot)\ccmcache" -ErrorAction SilentlyContinue
    $ccmfolders | ForEach-Object {
        $acl = Get-Acl $_.FullName
        $permission = "$($env:username)", "FullControl", "Allow"
        $accessrule = New-Object system.security.accesscontrol.filesystemaccessrule $permission
        $acl.AddAccessRule($accessrule)
        $acl | Set-Acl $_.FullName -ErrorAction SilentlyContinue
        Remove-Item $_.FullName -Recurse -Force -Confirm:$false -ErrorAction SilentlyContinue
    }
}

function Clear-Sophos {
    $sophoscache = Get-ChildItem "$($env:programdata)\Sophos\AutoUpdate\Cache"
    $sophoscache | ForEach-Object {
        $acl = get-acl $_.FullName
        $permission = "$($env:username)", "FullControl", "Allow"
        $accessrule = New-Object system.security.accesscontrol.filesystemaccessrule $permission
        $acl.AddAccessRule($accessrule)
        $acl | Set-Acl $_.FullName -ErrorAction SilentlyContinue
        Remove-Item $_.FullName -Recurse -Force -Confirm:$false -ErrorAction SilentlyContinue
    }
}

function Component-Cleanup2012 {
    $OS = (Get-WmiObject Win32_OperatingSystem).Caption
    switch -Wildcard ($OS) {
        "*2012*" {
            dism.exe /online /Cleanup-Image /StartComponentCleanup
        }
    }
}

function Find-SQLDatabases {
    $databases = Get-ChildItem -recurse "$($env:programfiles)\Microsoft SQL Server" -ErrorAction SilentlyContinue | Where-Object { $_.Name -like "*.*df" -and $_.Name -inotlike "master.*df" -and $_.Name -inotlike "model.*df" -and $_.Name -inotlike "msdbdata.*df" }
    if ($databases) {
        Write-Host  -BackgroundColor RED "WARNING: The Following databases exist on $($env:systemdrive) and should be moved."
        $databases | Sort-Object length -Descending  | Select-Object Name, @{Name = "DB Size MB"; Expression = { [math]::round($($_.length / 1MB), 2) } } -first 5
    }
}

#Get Free Space before clearing anything.
$initialsize = Get-FreeSpace -Driveletter C -unit GB

#Check if running as Administrator
#if ($host.UI.RawUI.WindowTitle -notlike "Administrator:*") {
#    throw "Powershell not running as Administrator. `n Run as Administrator and try again"
#}

#Begin Cleanup
Remove-WindowsTempFiles
Remove-UserProfiles
Clear-RecycleBin
Clear-IISLogs
Clear-ErrorReports
Clear-FontCache
Clear-CCMCache
Clear-Sophos
Component-Cleanup2012
Find-SQLDatabases

if ($componentcleanup) {
    Component-Cleanup
}

#End Cleanup

$Newsize = Get-FreeSpace -Driveletter C -unit GB

#Calculate Space Saved.
$Clearedspace = '{0:N2} GB' -f ($Newsize - $initialsize )
Write-Host "Successfully Cleared $Clearedspace"

Back to Top


Download

Please feel free to copy parts of the script or if you would like to download the entire script, simple click the download button. You can download the complete repository in a zip file by clicking the Download link in the menu bar on the left hand side of the page.


Report Issues

You can report an issue or contribute to this site on GitHub. Simply click the button below and add any relevant notes. I will attempt to respond to all issues as soon as possible.

Issue


Back to Top