PowerShell/Kasowaczka/kasowaczka.ps1

214 lines
15 KiB
PowerShell

<#
Skrypt kasujący pliki i foldery starsze niż N dni z lokazliacji X na podstawie parametru LastWriteTime
Schemat działania:
1. Kasowanie plików starszych niż N dni.
2. Zapisywanie listy folderów starszych niż N dni w paczkach po $stronicowanie.
3. Kasowanie folderów na podstawie utworzonych paczek od końca.
Przykład:
.\Kasowaczka.ps1 -path "C:\Users\tokostrzewa\Desktop" -days 10 -nazwa "Pulpit_Kasowanie_10"
#>
param (
[Parameter(Mandatory=$true, HelpMessage="Podaj pełną ścieżkę do katalogu.")][string]$path,
[Parameter(Mandatory=$true, HelpMessage="Podaj liczbę dni po której pliki będą kasowane.")][int]$days,
[Parameter(Mandatory=$true, HelpMessage="Nazwa kasowania.")][string]$nazwa
)
$actual_date = Get-Date
$actual_date_str = $actual_date.ToString("yyyyMMddHHmmss")
$middle_date = Get-Date
$end_date = Get-Date
$stronicowanie = 25000
$licznik = 0
$licznik_csv = 0
$path_main = "D:\Scripts\kasowaczka"
$path_archive_main = "$($path_main)\archive"
$path_archive = "$($path_main)\archive\$($actual_date_str)_$($nazwa)"
$path_log = "$($path_archive)\script.log"
$path_tmp = "$($path_archive)\tmp"
$array_object_list = [System.Collections.Generic.List[pscustomobject]]::new()
$array_folder_list = [System.Collections.Generic.List[pscustomobject]]::new()
$array_stronicowanie = @()
$delete_date = $actual_date.AddDays(-$days)
$l_plik = 0
$l_folder = 0
# Weryfikacja istnienia katalogów i plików niezbędnych do wykonania skryptu:
if (-not(Test-Path $path_main)) {
try {
New-Item -Path $path_main -ItemType Directory -ErrorAction Stop | Out-Null
} catch {
"Nie odnaleziono lokalizacji $path_main | Zamykam."
exit
}
}
if (-not(Test-Path $path_archive_main)) {
try {
New-Item -Path $path_archive_main -ItemType Directory -ErrorAction Stop | Out-Null
} catch {
"Nie odnaleziono lokalizacji $path_archive_main | Zamykam."
exit
}
}
if (-not(Test-Path $path_archive)) {
try {
New-Item -Path $path_archive -ItemType Directory -ErrorAction Stop | Out-Null
} catch {
"Nie odnaleziono lokalizacji $path_archive | Zamykam."
exit
}
}
if (-not(Test-Path $path_log)) {
try {
New-Item -Path $path_log -ItemType File -ErrorAction Stop | Out-Null
} catch {
"Nie odnaleziono lokalizacji $path_log | Zamykam."
exit
}
}
if (-not(Test-Path $path_tmp)) {
try {
New-Item -Path $path_tmp -ItemType Directory -ErrorAction Stop | Out-Null
} catch {
"Nie odnaleziono lokalizacji $path_tmp | Zamykam."
exit
}
}
"$(($actual_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Start skryptu" | Add-Content -LiteralPath $path_log -Encoding Default
"$((Get-Date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Weryfikacja istnienia katalogu `"$($path)`"" | Add-Content -LiteralPath $path_log -Encoding Default
if (-not(Test-Path $path)) {
"$((Get-Date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Nie odnaleziono katalogu `"$($path)`" | Zamykam" | Add-Content -LiteralPath $path_log -Encoding Default
exit
}
"$((Get-Date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Rozpoczynam przeszukiwanie lokalizacji `"$($path)`" w poszukiwaniu plików i folderów starszych niż `"$($days)`" dni ($($delete_date.ToString("[yyyy-MM-dd HH:mm:ss.ffff]"))) wraz z jednoczesnym kasowaniem plików" | Add-Content -LiteralPath $path_log -Encoding Default
Get-ChildItem -LiteralPath $path -Recurse | ForEach-Object {
if ($_.LastWriteTime -lt $delete_date) {
# Zapisaywanie listy katalogów. Próba skasowania katalogów podejmowana jest po skasowaniu plików starszych niż N dni.
if ($_.PSIsContainer -eq $true) {
$licznik++
$tmp = [PSCustomObject]@{
FullName = $_.FullName
CreationTime = $_.CreationTime
LastWriteTime = $_.LastWriteTime
PSIsContainer = $_.PSIsContainer
}
$array_object_list.Add($tmp)
# Stronicowanie wyników w celu przyśpieszenia operacji.
if ($licznik -eq $stronicowanie) {
$licznik_csv++
$licznik_csv_formatowany = "{0:D10}" -f $licznik_csv
try {
$array_object_list | Export-Csv -LiteralPath "$($path_tmp)\$($licznik_csv_formatowany).csv" -NoTypeInformation -Encoding Default -ErrorAction Stop
} catch {
"$((Get-Date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Nie udało się zapisać pliku z katalogami do usunięcia: `"$($path_tmp)\$($licznik_csv_formatowany).csv`"" | Add-Content -LiteralPath $path_log -Encoding Default
}
# Wyczyszczenie tablicy z elementów.
$array_object_list = [System.Collections.Generic.List[pscustomobject]]::new()
$licznik = 0
}
} else {
# Kasowanie znalezionych obiektów starszych niż x Dni.
try {
Remove-Item -LiteralPath $_.FullName -ErrorAction Stop
$l_plik++
} catch {
"$((Get-Date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Nie udało się skasować pliku: `"$($_.FullName)`" | Bład: $($error[0])" | Add-Content -LiteralPath $path_log -Encoding Default
}
}
}
}
# Zapisaywanie listy katalogów w przypadku nie osiągnięcia ($licznik -eq $stronicowanie) po pełnym przebiegu.
if ($array_object_list.count -ne 0) {
$licznik_csv++
$licznik_csv_formatowany = "{0:D10}" -f $licznik_csv
try {
$array_object_list | Export-Csv -LiteralPath "$($path_tmp)\$($licznik_csv_formatowany).csv" -NoTypeInformation -Encoding Default -ErrorAction Stop
} catch {
"$((Get-Date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Nie udało się zapisać pliku z katalogami do usunięcia: `"$($path_tmp)\$($licznik_csv_formatowany).csv`"" | Add-Content -LiteralPath $path_log -Encoding Default
}
# Wyczyszczenie tablicy z elementów.
$array_object_list = [System.Collections.Generic.List[pscustomobject]]::new()
$licznik = 0
}
# Na tym etapie zakończono kasowanie plików starszych niż X dni.
$middle_date = Get-Date
"$(($middle_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Kasowanie $($l_plik) plików zakończono po..." | Add-Content -LiteralPath $path_log -Encoding Default
"$(($middle_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Days :$(($middle_date - $actual_date).Days)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($middle_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Hours :$(($middle_date - $actual_date).Hours)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($middle_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Minutes :$(($middle_date - $actual_date).Minutes)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($middle_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Seconds :$(($middle_date - $actual_date).Seconds)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($middle_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Milliseconds :$(($middle_date - $actual_date).Milliseconds)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($middle_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Ticks :$(($middle_date - $actual_date).Ticks)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($middle_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | TotalDays :$(($middle_date - $actual_date).TotalDays)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($middle_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | TotalHours :$(($middle_date - $actual_date).TotalHours)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($middle_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | TotalMinutes :$(($middle_date - $actual_date).TotalMinutes)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($middle_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | TotalSeconds :$(($middle_date - $actual_date).TotalSeconds)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($middle_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | TotalMilliseconds :$(($middle_date - $actual_date).TotalMilliseconds)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($middle_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Zaczynam kasowanie folderów..." | Add-Content -LiteralPath $path_log -Encoding Default
# Rozpoczęcie kasowania folderów od końca.
$array_folder_list = Get-ChildItem -LiteralPath $path_tmp
[array]$array_folder_list = $array_folder_list | Sort-Object name -Descending
for ($i = 0; $i -lt $array_folder_list.Count; $i++) {
[array]$array_stronicowanie = Import-Csv -LiteralPath "$($array_folder_list[$i].FullName)" -Encoding Default
"$((Get-Date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Procesuję plik `"$($array_folder_list[$i].FullName)`" z $($array_folder_list.count)" | Add-Content -LiteralPath $path_log -Encoding Default
for ($ii = (($array_stronicowanie.Count)-1); $ii -ge 0; $ii--) {
# weryfikacja czy folder jest pusty
try {
$weryfikacja = Get-ChildItem -LiteralPath "$($array_stronicowanie[$ii].FullName)" | Select-Object -First 1 -ErrorAction Stop
} catch {
$weryfikacja = "error"
}
# kasowanie folderu
if ((($weryfikacja.count) -eq 0)) {
try {
Remove-Item -LiteralPath "$($array_stronicowanie[$ii].FullName)" -ErrorAction Stop
$l_folder++
} catch {
"$((Get-Date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Nie udało się skasować katalogu: `"$($array_stronicowanie[$ii].FullName)`" | // $($array_folder_list[$i].FullName) // $i // $ii // | Bład: $($error[0])" | Add-Content -LiteralPath $path_log -Encoding Default
}
} elseif ($weryfikacja -eq "error") {
"$((Get-Date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Nie udało się uzyskać dostępu do katalogu: `"$($array_stronicowanie[$ii].FullName)`" | // $($array_folder_list[$i].FullName) // $i // $ii // | Bład: $($error[0])" | Add-Content -LiteralPath $path_log -Encoding Default
}
}
$array_stronicowanie = @()
}
$end_date = Get-Date
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Kasowanie $($l_folder) folderów zakończono po..." | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Days :$(($end_date - $middle_date).Days)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Hours :$(($end_date - $middle_date).Hours)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Minutes :$(($end_date - $middle_date).Minutes)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Seconds :$(($end_date - $middle_date).Seconds)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Milliseconds :$(($end_date - $middle_date).Milliseconds)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Ticks :$(($end_date - $middle_date).Ticks)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | TotalDays :$(($end_date - $middle_date).TotalDays)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | TotalHours :$(($end_date - $middle_date).TotalHours)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | TotalMinutes :$(($end_date - $middle_date).TotalMinutes)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | TotalSeconds :$(($end_date - $middle_date).TotalSeconds)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | TotalMilliseconds :$(($end_date - $middle_date).TotalMilliseconds)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Podliczenie całości..." | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Days :$(($end_date - $actual_date).Days)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Hours :$(($end_date - $actual_date).Hours)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Minutes :$(($end_date - $actual_date).Minutes)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Seconds :$(($end_date - $actual_date).Seconds)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Milliseconds :$(($end_date - $actual_date).Milliseconds)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Ticks :$(($end_date - $actual_date).Ticks)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | TotalDays :$(($end_date - $actual_date).TotalDays)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | TotalHours :$(($end_date - $actual_date).TotalHours)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | TotalMinutes :$(($end_date - $actual_date).TotalMinutes)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | TotalSeconds :$(($end_date - $actual_date).TotalSeconds)" | Add-Content -LiteralPath $path_log -Encoding Default
"$(($end_date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | TotalMilliseconds :$(($end_date - $actual_date).TotalMilliseconds)" | Add-Content -LiteralPath $path_log -Encoding Default
"$((Get-Date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Skasowano: $l_plik plików" | Add-Content -LiteralPath $path_log -Encoding Default
"$((Get-Date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Skasowano: $l_folder folderów" | Add-Content -LiteralPath $path_log -Encoding Default
try {
Remove-Item -LiteralPath $path_tmp -Recurse | Out-Null
"$((Get-Date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Skasowano pliki tymczasowe z `"$path_tmp`"" | Add-Content -LiteralPath $path_log -Encoding Default
} catch {
"$((Get-Date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Nie udało się skasować plików tymczasowych z: `"$path_tmp`"" | Add-Content -LiteralPath $path_log -Encoding Default
}
"$((Get-Date).ToString("[yyyy-MM-dd HH:mm:ss.ffff]")) | Zamykam" | Add-Content -LiteralPath $path_log -Encoding Default