# encoding: ascii
# api: powershell
# title: Delete Files per folder
# description: another delete files script
# version: 0.1
# type: script
# author: chriskenis
# license: CC0
# x-poshcode-id: 5530
# x-archived: 2015-01-31T20:29:10
# x-published: 2015-10-21T03:34:00
#
#
<#

.SYNOPSIS
Deletes files in directory based on age measured in days

.DESCRIPTION
Delete files in folder with use of regular filter, either recursive or not.

.PARAMETER DelFilter 
Provide a filter like "*.txt" or "mylogs*"

.PARAMETER DelPath
The directory where files are to be deleted from, use the Recurse switch to delete from subfolder as well

.EXAMPLE
Remove-Files -delpath "C:\temp" -delfilter "Whatever-*" -fileage "30" -LogPath "C:\temp"

.NOTES
Instead of simply using a gci -Path -Filter -Recurse | Remove-Item I wanted a clean output per folder
Enable debug mode, to write delete actions to the log file without actually deleting the files

#>

Param(
$DelPath = $(throw "Provide path to delete files from"),
$DelFilter = $(throw "Provide a filter like *.txt or mylogs*"),
[int] $FileAge = $(throw "number of days to keep, set it to 0 for all files"),
$LogPath = $($Env:windir),
[switch] $Recurse, 
[switch] $Debug
)
#named parameters
"Path: {0}" -f $DelPath
"DelFilter: {0}" -f $DelFilter
"Age: {0}" -f $FileAge
"LogPath: {0}" -f $LogPath
#begin log action
$LogFile = $LogPath + "\DelFiles" + ".log"
$global:FileCount = 0

# function as one place to set output action
Function WriteLog ($Output){
	Write-output $Output | Out-File -Append -FilePath $LogFile
	}
# delete files in every parsed folder
Function DeleteFiles ($DelFolder){
	foreach ($Item in Get-ChildItem -Force -Path $DelFolder -Filter $DelFilter){
		if ($Item.CreationTime -lt ($(Get-Date).AddDays(-$FileAge))){
			#if -debug parameter is used only log action, no delete action
			if (-not $Debug) { Remove-Item $Item.FullName}
			#delete log action
			WriteLog "`t $Item"
			$global:FileCount = $global:FileCount +1
		}
	}
}
# actual script execution
WriteLog "Deleting file(s) older than $FileAge day(s) at $DelPath"
$Date = Get-Date
WriteLog "Begin of operation at: $Date"
# file delete action
WriteLog $Delpath
DeleteFiles $Delpath
if ($Recurse){
	foreach ($Folder in (gci -Path $DelPath -recurse:$Recurse | ?{$_.PSIsContainer})){
		# create array first to report if only one or no item
		$NrFiles = @(Get-ChildItem -Force -Path $Folder.Fullname -Filter $DelFilter).count
		if ( $NrFiles -gt 0){
			WriteLog $Folder.Fullname
			DeleteFiles $Folder.Fullname
		}
	}
}
# end log action
WriteLog "$global:FileCount file(s) deleted successfully"
$Date = Get-Date
WriteLog "End of operation at: $Date"
