tech

Opschonen c-schijf

Voor het opruimen van tijdelijke-, cache en windows update bestanden kwam ik binnen de technet galleries een mooi script van Matthew Kerfoot tegen.

Denk eraan dat je voorafgaand aan het uitvoeren je execution-policy op unrestricted zet.

set-executionpolicy unrestricted

Het opschoon script zelf:

Function Start-Cleanup {
 <# 
 .SYNOPSIS
    Automate cleaning up a C:\ drive with low disk space
 .DESCRIPTION
    Cleans the C: drive's Window Temperary files, Windows SoftwareDistribution folder, 
    the local users Temperary folder, IIS logs(if applicable) and empties the recycling bin. 
    All deleted files will go into a log transcript in $env:TEMP. By default this 
    script leaves files that are newer than 7 days old however this variable can be edited.
 .EXAMPLE
    PS C:> .\Start-Cleanup.ps1
    Save the file to your hard drive with a .PS1 extention and run the file from an elavated PowerShell prompt.
 .NOTES
    This script will typically clean up anywhere from 1GB up to 15GB of space from a C: drive.
 .FUNCTIONALITY
    PowerShell v3+
 >
 Allows the use of -WhatIf
 [CmdletBinding(SupportsShouldProcess=$True)]
 param(
     ## Delete data older then $daystodelete
     [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=0)]
     $DaysToDelete = 7,
 ## LogFile path for the transcript to be written to [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=1)] $LogFile = ("$env:TEMP\" + (get-date -format "MM-d-yy-HH-mm") + '.log'), ## All verbose outputs will get logged in the transcript($logFile) [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=2)] $VerbosePreference = "Continue", ## All errors should be withheld from the console [Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true,Position=3)] $ErrorActionPreference = "SilentlyContinue"
 )
 ## Begin the timer $Starters = (Get-Date) ## Check $VerbosePreference variable, and turns -Verbose on Function global:Write-Verbose ( [string]$Message ) {     if ( $VerbosePreference -ne 'SilentlyContinue' ) {         Write-Host "$Message" -ForegroundColor 'Green'     } } ## Tests if the log file already exists and renames the old file if it does exist if(Test-Path $LogFile){     ## Renames the log to be .old     Rename-Item $LogFile $LogFile.old -Verbose -Force } else {     ## Starts a transcript in C:\temp so you can see which files were deleted     Write-Host (Start-Transcript -Path $LogFile) -ForegroundColor Green } ## Writes a verbose output to the screen for user information Write-Host "Retriving current disk percent free for comparison once the script has completed.                 " -NoNewline -ForegroundColor Green Write-Host "[DONE]" -ForegroundColor Green -BackgroundColor Black ## Gathers the amount of disk space used before running the script $Before = Get-WmiObject Win32_LogicalDisk | Where-Object { $_.DriveType -eq "3" } | Select-Object SystemName, @{ Name = "Drive" ; Expression = { ( $_.DeviceID ) } }, @{ Name = "Size (GB)" ; Expression = {"{0:N1}" -f ( $_.Size / 1gb)}}, @{ Name = "FreeSpace (GB)" ; Expression = {"{0:N1}" -f ( $_.Freespace / 1gb ) } }, @{ Name = "PercentFree" ; Expression = {"{0:P1}" -f ( $_.FreeSpace / $_.Size ) } } |     Format-Table -AutoSize |     Out-String ## Stops the windows update service so that c:\windows\softwaredistribution can be cleaned up Get-Service -Name wuauserv | Stop-Service -Force -ErrorAction SilentlyContinue -WarningAction SilentlyContinue -Verbose # Sets the SCCM cache size to 1 GB if it exists. if ((Get-WmiObject -namespace root\ccm\SoftMgmtAgent -class CacheConfig) -ne "$null"){     # if data is returned and sccm cache is configured it will shrink the size to 1024MB.     $cache = Get-WmiObject -namespace root\ccm\SoftMgmtAgent -class CacheConfig     $Cache.size = 1024 | Out-Null     $Cache.Put() | Out-Null     Restart-Service ccmexec -ErrorAction SilentlyContinue -WarningAction SilentlyContinue } ## Deletes the contents of windows software distribution. Get-ChildItem "C:\Windows\SoftwareDistribution\*" -Recurse -Force -ErrorAction SilentlyContinue | Remove-Item -recurse -ErrorAction SilentlyContinue -Verbose Write-Host "The Contents of Windows SoftwareDistribution have been removed successfully!                      " -NoNewline -ForegroundColor Green Write-Host "[DONE]" -ForegroundColor Green -BackgroundColor Black ## Deletes the contents of the Windows Temp folder. Get-ChildItem "C:\Windows\Temp\*" -Recurse -Force -Verbose -ErrorAction SilentlyContinue |     Where-Object { ($_.CreationTime -lt $(Get-Date).AddDays( - $DaysToDelete)) } | Remove-Item -force -recurse -ErrorAction SilentlyContinue -Verbose Write-host "The Contents of Windows Temp have been removed successfully!                                      " -NoNewline -ForegroundColor Green Write-Host "[DONE]" -ForegroundColor Green -BackgroundColor Black ## Deletes all files and folders in user's Temp folder older then $DaysToDelete Get-ChildItem "C:\users\*\AppData\Local\Temp\*" -Recurse -Force -ErrorAction SilentlyContinue |     Where-Object { ($_.CreationTime -lt $(Get-Date).AddDays( - $DaysToDelete))} |     Remove-Item -force -recurse -ErrorAction SilentlyContinue -Verbose Write-Host "The contents of `$env:TEMP have been removed successfully!                                         " -NoNewline -ForegroundColor Green Write-Host "[DONE]" -ForegroundColor Green -BackgroundColor Black ## Removes all files and folders in user's Temporary Internet Files older then $DaysToDelete Get-ChildItem "C:\users\*\AppData\Local\Microsoft\Windows\Temporary Internet Files\*" `     -Recurse -Force -Verbose -ErrorAction SilentlyContinue |     Where-Object {($_.CreationTime -lt $(Get-Date).AddDays( - $DaysToDelete))} |     Remove-Item -Force -Recurse -ErrorAction SilentlyContinue -Verbose Write-Host "All Temporary Internet Files have been removed successfully!                                      " -NoNewline -ForegroundColor Green Write-Host "[DONE]" -ForegroundColor Green -BackgroundColor Black ## Removes *.log from C:\windows\CBS if(Test-Path C:\Windows\logs\CBS\){ Get-ChildItem "C:\Windows\logs\CBS\*.log" -Recurse -Force -ErrorAction SilentlyContinue |     remove-item -force -recurse -ErrorAction SilentlyContinue -Verbose Write-Host "All CBS logs have been removed successfully!                                                      " -NoNewline -ForegroundColor Green Write-Host "[DONE]" -ForegroundColor Green -BackgroundColor Black } else {     Write-Host "C:\inetpub\logs\LogFiles\ does not exist, there is nothing to cleanup.                         " -NoNewline -ForegroundColor DarkGray     Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } ## Cleans IIS Logs older then $DaysToDelete if (Test-Path C:\inetpub\logs\LogFiles\) {     Get-ChildItem "C:\inetpub\logs\LogFiles\*" -Recurse -Force -ErrorAction SilentlyContinue |         Where-Object { ($_.CreationTime -lt $(Get-Date).AddDays(-60)) } | Remove-Item -Force -Verbose -Recurse -ErrorAction SilentlyContinue     Write-Host "All IIS Logfiles over $DaysToDelete days old have been removed Successfully!                  " -NoNewline -ForegroundColor Green     Write-Host "[DONE]" -ForegroundColor Green -BackgroundColor Black } else {     Write-Host "C:\Windows\logs\CBS\ does not exist, there is nothing to cleanup.                                 " -NoNewline -ForegroundColor DarkGray     Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } ## Removes C:\Config.Msi if (test-path C:\Config.Msi){     remove-item -Path C:\Config.Msi -force -recurse -Verbose -ErrorAction SilentlyContinue } else {     Write-Host "C:\Config.Msi does not exist, there is nothing to cleanup.                                        " -NoNewline -ForegroundColor DarkGray     Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } ## Removes c:\Intel if (test-path c:\Intel){     remove-item -Path c:\Intel -force -recurse -Verbose -ErrorAction SilentlyContinue } else {     Write-Host "c:\Intel does not exist, there is nothing to cleanup.                                             " -NoNewline -ForegroundColor DarkGray     Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } ## Removes c:\PerfLogs if (test-path c:\PerfLogs){     remove-item -Path c:\PerfLogs -force -recurse -Verbose -ErrorAction SilentlyContinue } else {     Write-Host "c:\PerfLogs does not exist, there is nothing to cleanup.                                          " -NoNewline -ForegroundColor DarkGray     Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } ## Removes $env:windir\memory.dmp if (test-path $env:windir\memory.dmp){     remove-item $env:windir\memory.dmp -force -Verbose -ErrorAction SilentlyContinue } else {     Write-Host "C:\Windows\memory.dmp does not exist, there is nothing to cleanup.                                " -NoNewline -ForegroundColor DarkGray     Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } ## Removes rouge folders Write-host "Deleting Rouge folders                                                                            " -NoNewline -ForegroundColor Green Write-Host "[DONE]" -ForegroundColor Green -BackgroundColor Black ## Removes Windows Error Reporting files if (test-path C:\ProgramData\Microsoft\Windows\WER){     Get-ChildItem -Path C:\ProgramData\Microsoft\Windows\WER -Recurse | Remove-Item -force -recurse -Verbose -ErrorAction SilentlyContinue         Write-host "Deleting Windows Error Reporting files                                                            " -NoNewline -ForegroundColor Green         Write-Host "[DONE]" -ForegroundColor Green -BackgroundColor Black     } else {         Write-Host "C:\ProgramData\Microsoft\Windows\WER does not exist, there is nothing to cleanup.            " -NoNewline -ForegroundColor DarkGray         Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } ## Removes System and User Temp Files - lots of access denied will occur. ## Cleans up c:\windows\temp if (Test-Path $env:windir\Temp\) {     Remove-Item -Path "$env:windir\Temp\*" -Force -Recurse -Verbose -ErrorAction SilentlyContinue } else {         Write-Host "C:\Windows\Temp does not exist, there is nothing to cleanup.                                 " -NoNewline -ForegroundColor DarkGray         Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } ## Cleans up minidump if (Test-Path $env:windir\minidump\) {     Remove-Item -Path "$env:windir\minidump\*" -Force -Recurse -Verbose -ErrorAction SilentlyContinue } else {         Write-Host "$env:windir\minidump\ does not exist, there is nothing to cleanup.                           " -NoNewline -ForegroundColor DarkGray         Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } ## Cleans up prefetch if (Test-Path $env:windir\Prefetch\) {     Remove-Item -Path "$env:windir\Prefetch\*" -Force -Recurse -Verbose -ErrorAction SilentlyContinue } else {         Write-Host "$env:windir\Prefetch\ does not exist, there is nothing to cleanup.                           " -NoNewline -ForegroundColor DarkGray         Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } ## Cleans up each users temp folder if (Test-Path "C:\Users\*\AppData\Local\Temp\") {     Remove-Item -Path "C:\Users\*\AppData\Local\Temp\*" -Force -Recurse -Verbose -ErrorAction SilentlyContinue } else {         Write-Host "C:\Users\*\AppData\Local\Temp\ does not exist, there is nothing to cleanup.                  " -NoNewline -ForegroundColor DarkGray         Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } ## Cleans up all users windows error reporting if (Test-Path "C:\Users\*\AppData\Local\Microsoft\Windows\WER\") {     Remove-Item -Path "C:\Users\*\AppData\Local\Microsoft\Windows\WER\*" -Force -Recurse -Verbose -ErrorAction SilentlyContinue } else {         Write-Host "C:\ProgramData\Microsoft\Windows\WER does not exist, there is nothing to cleanup.            " -NoNewline -ForegroundColor DarkGray         Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } ## Cleans up users temporary internet files if (Test-Path "C:\Users\*\AppData\Local\Microsoft\Windows\Temporary Internet Files\") {     Remove-Item -Path "C:\Users\*\AppData\Local\Microsoft\Windows\Temporary Internet Files\*" -Force -Recurse -Verbose -ErrorAction SilentlyContinue } else {         Write-Host "C:\Users\*\AppData\Local\Microsoft\Windows\Temporary Internet Files\ does not exist.              " -NoNewline -ForegroundColor DarkGray         Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } ## Cleans up Internet Explorer cache if (Test-Path "C:\Users\*\AppData\Local\Microsoft\Windows\IECompatCache\") {     Remove-Item -Path "C:\Users\*\AppData\Local\Microsoft\Windows\IECompatCache\*" -Force -Recurse -Verbose -ErrorAction SilentlyContinue } else {         Write-Host "C:\Users\*\AppData\Local\Microsoft\Windows\IECompatCache\ does not exist.                         " -NoNewline -ForegroundColor DarkGray         Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } ## Cleans up Internet Explorer cache if (Test-Path "C:\Users\*\AppData\Local\Microsoft\Windows\IECompatUaCache\") {     Remove-Item -Path "C:\Users\*\AppData\Local\Microsoft\Windows\IECompatUaCache\*" -Force -Recurse -Verbose -ErrorAction SilentlyContinue } else {         Write-Host "C:\Users\*\AppData\Local\Microsoft\Windows\IECompatUaCache\ does not exist.                       " -NoNewline -ForegroundColor DarkGray         Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } ## Cleans up Internet Explorer download history if (Test-Path "C:\Users\*\AppData\Local\Microsoft\Windows\IEDownloadHistory\") {     Remove-Item -Path "C:\Users\*\AppData\Local\Microsoft\Windows\IEDownloadHistory\*" -Force -Recurse -Verbose -ErrorAction SilentlyContinue } else {         Write-Host "C:\Users\*\AppData\Local\Microsoft\Windows\IEDownloadHistory\ does not exist.                     " -NoNewline -ForegroundColor DarkGray         Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } ## Cleans up Internet Cache if (Test-Path "C:\Users\*\AppData\Local\Microsoft\Windows\INetCache\") {     Remove-Item -Path "C:\Users\*\AppData\Local\Microsoft\Windows\INetCache\*" -Force -Recurse -Verbose -ErrorAction SilentlyContinue } else {         Write-Host "C:\Users\*\AppData\Local\Microsoft\Windows\INetCache\ does not exist.                             " -NoNewline -ForegroundColor DarkGray         Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } ## Cleans up Internet Cookies if (Test-Path "C:\Users\*\AppData\Local\Microsoft\Windows\INetCookies\") {     Remove-Item -Path "C:\Users\*\AppData\Local\Microsoft\Windows\INetCookies\*" -Force -Recurse -Verbose -ErrorAction SilentlyContinue } else {         Write-Host "C:\Users\*\AppData\Local\Microsoft\Windows\INetCookies\ does not exist.                           " -NoNewline -ForegroundColor DarkGray         Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } ## Cleans up terminal server cache if (Test-Path "C:\Users\*\AppData\Local\Microsoft\Terminal Server Client\Cache\") {     Remove-Item -Path "C:\Users\*\AppData\Local\Microsoft\Terminal Server Client\Cache\*" -Force -Recurse -Verbose -ErrorAction SilentlyContinue } else {         Write-Host "C:\Users\*\AppData\Local\Microsoft\Terminal Server Client\Cache\ does not exist.                  " -NoNewline -ForegroundColor DarkGray         Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } Write-host "Removing System and User Temp Files                                                               " -NoNewline -ForegroundColor Green Write-Host "[DONE]" -ForegroundColor Green -BackgroundColor Black ## Removes the hidden recycling bin. if (Test-path 'C:\$Recycle.Bin'){     Remove-Item 'C:\$Recycle.Bin' -Recurse -Force -Verbose -ErrorAction SilentlyContinue } else {     Write-Host "C:\`$Recycle.Bin does not exist, there is nothing to cleanup.                                      " -NoNewline -ForegroundColor DarkGray     Write-Host "[WARNING]" -ForegroundColor DarkYellow -BackgroundColor Black } ## Turns errors back on $ErrorActionPreference = "Continue" ## Checks the version of PowerShell ## If PowerShell version 4 or below is installed the following will process if ($PSVersionTable.PSVersion.Major -le 4) {     ## Empties the recycling bin, the desktop recyling bin     $Recycler = (New-Object -ComObject Shell.Application).NameSpace(0xa)     $Recycler.items() | ForEach-Object {          ## If PowerShell version 4 or bewlow is installed the following will process         Remove-Item -Include $_.path -Force -Recurse -Verbose         Write-Host "The recycling bin has been cleaned up successfully!                                        " -NoNewline -ForegroundColor Green         Write-Host "[DONE]" -ForegroundColor Green -BackgroundColor Black     } } elseif ($PSVersionTable.PSVersion.Major -ge 5) {      ## If PowerShell version 5 is running on the machine the following will process      Clear-RecycleBin -DriveLetter C:\ -Force -Verbose      Write-Host "The recycling bin has been cleaned up successfully!                                               " -NoNewline -ForegroundColor Green      Write-Host "[DONE]" -ForegroundColor Green -BackgroundColor Black } ## Starts cleanmgr.exe Function Start-CleanMGR {     Try{         Write-Host "Windows Disk Cleanup is running.                                                                  " -NoNewline -ForegroundColor Green         Start-Process -FilePath Cleanmgr -ArgumentList '/sagerun:1' -Wait -Verbose         Write-Host "[DONE]" -ForegroundColor Green -BackgroundColor Black     }     Catch [System.Exception]{         Write-host "cleanmgr is not installed! To use this portion of the script you must install the following windows features:" -ForegroundColor Red -NoNewline         Write-host "[ERROR]" -ForegroundColor Red -BackgroundColor black     } } Start-CleanMGR ## gathers disk usage after running the cleanup cmdlets. $After = Get-WmiObject Win32_LogicalDisk | Where-Object { $_.DriveType -eq "3" } | Select-Object SystemName, @{ Name = "Drive" ; Expression = { ( $_.DeviceID ) } }, @{ Name = "Size (GB)" ; Expression = {"{0:N1}" -f ( $_.Size / 1gb)}}, @{ Name = "FreeSpace (GB)" ; Expression = {"{0:N1}" -f ( $_.Freespace / 1gb ) } }, @{ Name = "PercentFree" ; Expression = {"{0:P1}" -f ( $_.FreeSpace / $_.Size ) } } |     Format-Table -AutoSize | Out-String ## Restarts wuauserv Get-Service -Name wuauserv | Start-Service -ErrorAction SilentlyContinue ## Stop timer $Enders = (Get-Date) ## Calculate amount of seconds your code takes to complete. Write-Verbose "Elapsed Time: $(($Enders - $Starters).totalseconds) seconds
 "
     ## Sends hostname to the console for ticketing purposes.
     Write-Host (Hostname) -ForegroundColor Green
 ## Sends the date and time to the console for ticketing purposes. Write-Host (Get-Date | Select-Object -ExpandProperty DateTime) -ForegroundColor Green ## Sends the disk usage before running the cleanup script to the console for ticketing purposes. Write-Verbose "
 Before: $Before"
 ## Sends the disk usage after running the cleanup script to the console for ticketing purposes. Write-Verbose "After: $After" ## Prompt to scan for large ISO, VHD, VHDX files. Function PromptforScan {     param(         $ScanPath,         $title = (Write-Host "Search for large files" -ForegroundColor Green),         $message = (Write-Host "Would you like to scan $ScanPath for ISOs or VHD(X) files?" -ForegroundColor Green)     )     $yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Scans $ScanPath for large files."     $no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Skips scanning $ScanPath for large files."     $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no)     $prompt = $host.ui.PromptForChoice($title, $message, $options, 0)     switch ($prompt) {         0 {             Write-Host "Scanning $ScanPath for any large .ISO and or .VHD\.VHDX files per the Administrators request." -ForegroundColor Green             Write-Verbose ( Get-ChildItem -Path $ScanPath -Include *.iso, *.vhd, *.vhdx -Recurse -ErrorAction SilentlyContinue |                      Sort-Object Length -Descending | Select-Object Name, Directory,                 @{Name = "Size (GB)"; Expression = { "{0:N2}" -f ($_.Length / 1GB) }} | Format-Table |                      Out-String -verbose )         }         1 {             Write-Host "The Administrator chose to not scan $ScanPath for large files." -ForegroundColor DarkYellow -Verbose         }     } } PromptforScan -ScanPath C:\  # end of function ## Completed Successfully! Write-Host (Stop-Transcript) -ForegroundColor Green Write-host "
 Script finished                                                                                   " -NoNewline -ForegroundColor Green
     Write-Host "[DONE]" -ForegroundColor Green -BackgroundColor Black
 }
 Start-Cleanup