<# 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