diff --git a/Kasowaczka/kasowaczka.ps1 b/Kasowaczka/kasowaczka.ps1 new file mode 100644 index 0000000..60b4ff9 --- /dev/null +++ b/Kasowaczka/kasowaczka.ps1 @@ -0,0 +1,213 @@ +<# +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 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 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