FC_SysAdmin.psm1
function Remove-FilesOlderThan{ <# .SYNOPSIS Deletes all files older than X (Days,Months or Years), and all empty directories inside of a given directory. This is helpful for managing archived copies of flat files that we send to third parties. #> [CmdletBinding()] param( [Parameter(ValueFromPipeline=$True, Position=0)] [string] $directory ,[ValidateSet("Days","Months","Years")][string] $DateType ,[int] $olderThan = 90 ,[switch] $areYouSure = $false ,[Parameter(position=0)][ValidateSet("Debug","Info","Warning","Error", "Disable")][string] $logLevel = "Warning" ) clear if ([string]::IsNullOrEmpty($directory)){ Write-Log "The directory parameter cannot be null" error -ErrorAction Stop } if ([string]::IsNullOrEmpty($DateType)){ Write-Log "The DateType parameter cannot be null" error -ErrorAction Stop } If (!(Test-Path $directory)){ Write-Log "Could not find a directory named: $directory" Error -ErrorAction Stop } if ($DateType -eq "Days"){ $timeCriteria = [DateTime]::Now.AddDays(-$olderThan) } if ($DateType -eq "Months"){ $timeCriteria = [DateTime]::Now.AddMonths(-$olderThan) } if ($DateType -eq "Years"){ $timeCriteria = [DateTime]::Now.AddYears(-$olderThan) } Write-Log "Searching for all files older than $olderThan $DateType" $files = Get-ChildItem $directory -File -Recurse | where {$_.LastWriteTime -le $timeCriteria} | Select -ExpandProperty FullName Write-Log "I found $($files.Count) files" if ($($files.Count) -gt 0){ if ($areYouSure){ Write-Log "You seem to be determined to delete the files, performing the delete on all $($files.Count) files" Warning $files | Foreach-Object { Write-Log "Removing old file $_" Debug Remove-Item $_ } } else{ $files | Foreach-Object {Remove-Item $_ -WhatIf} } } else{ Write-Log "No Files found" } Write-Log "Checking for Empty directories" do { $dirs = gci $directory -directory -recurse | Where { (gci $_.fullName).count -eq 0 } | select -expandproperty FullName if ($dirs.Count -gt 0){ if ($areYouSure){ Write-Log "You seem to be determined to delete the files, performing the delete on all $($dirs.Count) empty directories" Warning $dirs | Foreach-Object { Write-Log "Removing empty directory $_" Debug Remove-Item $_ } } else{ $dirs | Foreach-Object { Remove-Item $_ -WhatIf } Write-Log "When you are ready to actually delete all $($files.Count) files and $($dirs.Count) empty directories, run this function again with the areYouSure switch" Warning } } else{ Write-Log "No empty directories found" } } while ($dirs.count -gt 0) } Export-ModuleMember -Function Remove-FilesOlderThan Function Get-UserLoggedOn{ param($computerName = $env:COMPUTERNAME) Write-Output (Invoke-Command -ComputerName $computerName -ScriptBlock {Get-Process -IncludeUserName | Where name -eq "explorer" | Select-Object -Unique -Property UserName} ) }Export-ModuleMember -Function Get-UserLoggedOn # Import everything in sub folders folder foreach ( $folder in @( 'private', 'public', 'classes' ) ) { $root = Join-Path -Path $PSScriptRoot -ChildPath $folder if ( Test-Path -Path $root ) { Write-Verbose "processing folder $root" $files = Get-ChildItem -Path $root -Filter *.ps1 # dot source each file $files | where-Object { $_.name -NotLike '*.Tests.ps1' } | ForEach-Object { Write-Verbose $_.name; . $_.FullName } } } class BackupJob{ [string]$name [string]$SourcePath [string]$DestinationPath [BackupProvider]$BackupProvider BackupJob([string] $ProviderName,[string] $SourcePath,[string]$DestinationPath,[BackupProvider]$BackupProvider){ $this.name = $ProviderName $this.SourcePath = $SourcePath $this.DestinationPath = $DestinationPath $this.BackupProvider = $BackupProvider } } class BackupProvider{ [string]$name BackupProvider([string] $ProviderName){ $this.name = $ProviderName } } $Script:BackupJobs = @() $Script:BackupJobPath = "$env:USERPROFILE\.friendly-chainsaw\backupJobs.json" $Script:AllowedBackupProviders = @() $Script:AllowedBackupProviders += [BackupProvider]::new("pwsh") $Script:AllowedBackupProviders += [BackupProvider]::new("duplicati") if (Test-Path $Script:BackupJobPath ){ Read-BackupJobRepository } else{ New-Item $Script:BackupJobPath -ItemType File -Force } |