Odstranění souborů staších než X dnů / hodin - INFORMAČNÍ STRASTI

1 1 1 1 1 1 1 1 1 1 Hodnocení 100% (4 Hlasů)

Dříve nebo později při svém skriptování v powershellu narazíte, že budete potřebovat odstraňovat položky, které jsou starší jak x dní nebo hodin. Může se jednat o soubory nebo adresáře. Také se nemusí bezpodmínečně jednat pouze o mazání. V tomto článku chci spíše ukázat jednu z možných metod jak filtrovat položky dle data. Primárně se zaměříme na použití dvou cmdletů a to Get-Date a Get-ChildItem.

Pojďme tedy na to

Na začátku skriptu provedeme definici promněné "$starsi_nez" kde pomocí cmdletu Get-Date určíme, že chceme použít dny. To nám zajišťuje vlastnost ".AddDays", kde potom v závorce máme zápornou hodnodu kolik chceme, aby to bylo dní. V našem příkladu se jedná o 20 dnů. Případně můžeme použít vlastnost ".AddHours" a pak nepracujeme s dny, ale hodinami.

$starsi_nez=(Get-Date).AddDays(-20)

$starsi_nez=(Get-Date).AddHours(-5)

Použití uvedené promněné je následující

Get-ChildItem -Path  C:\Temp -Recurse -Force | Where-Object { ! $_ . PSIsContainer -and $_ . CreationTime -lt $limit }

V uvedeném příkladu pomocí rekusivního prohledání složky C:\Temp cmdletem Get-ChildItem získáme výpis všech souborů, které jsou starší více jak 20 dnů. Pokud bychom příkaz upravily takto (přídána pipe s cmdletem Remove-Item)

Get-ChildItem -Path  C:\Temp -Recurse -Force | Where-Object { ! $_ . PSIsContainer -and $_ . CreationTime -lt $limit } | Remove-Item -Force

budou soubory starší 20 smazány. V případě, že by v C:\Temp byl další adresář ve kterém by došlo k odstranění všech souborů (protože splňují podmínku pro smazání) tak bychom s největší pravděpodobností, chtěli odstranit i tento adresář. V dalším příkladu je uveden filtr, který nám zobrazí prázdné adresáře, starší 20 dnů.

Get-ChildItem-Path C:\Temp -Recurse-Force|Where-Object{$_.PSIsContainer-and(Get-ChildItem-Path$_.FullName-Recurse-Force|Where-Object{!$_.PSIsContainer})-eq$null}

Krátký kompletní skript, který nám odstraní soubory ve složce a podsložkách starší jak 20 dnů a následně i prázdné podadresáře by vypadal takto 

$Starsi_Nez=(Get-Date).AddDays(-20)
$Adresar="C:\Temp"

# Smaze soubory starsi nez hodnota uvedena v promnene $Starsi_Nez
Get-ChildItem-Path$path-Recurse-Force|Where-Object{!$_.PSIsContainer-and$_.CreationTime-lt$limit}|Remove-Item-Force

# Odstrani prazdne adresare, ktere zanechal predchozi prikaz, protoze smazal veskere soubory
Get-ChildItem-Path$path-Recurse-Force|Where-Object{$_.PSIsContainer-and(Get-ChildItem-Path$_.FullName-Recurse-Force|Where-Object{!$_.PSIsContainer})-eq$null}|Remove-Item-Force-Recurse

Pozor, při použití tohoto skriptu můžete odstranit soubory, které nechcete odstranit. Proto skript po uložení ve formátu *.ps1 raději spuste pomocí parametru -WhatIf. Díky tomuto přepínači Vám powershell ukáže výpis akcí, které by provedl a díky tomu můžete zabránit nežádoucímu smazání Vašich souborů. 
„Když už člověk jednou je, tak má koukat aby byl. A když kouká, aby byl a je, tak má být to, co je a nemá být to, co není, jak tomu v mnoha případech je.“ Jan Werich