231 votes

Supprimer les fichiers de plus de 15 jours à l'aide de PowerShell

Je voudrais supprimer uniquement les fichiers qui ont été créés il y a plus de 15 jours dans un dossier particulier. Comment pourrais-je faire cela en utilisant PowerShell ?

11 votes

La plupart des réponses utilisent CreationTime, mais comme cette valeur est réinitialisée lorsqu'un fichier est copié, il se peut que vous n'obteniez pas les résultats escomptés. LastWriteTime est ce qui correspond à la "Date Modified" dans l'Explorateur Windows.

384voto

deadlydog Points 1840

Les réponses données ne supprimeront que les fichiers (ce qui, il faut bien l'admettre, est ce qui est dans le titre de cet article), mais voici un code qui supprimera d'abord tous les fichiers de plus de 15 jours, puis supprimera récursivement tous les répertoires vides qui pourraient avoir été laissés derrière. Mon code utilise également la fonction -Force pour supprimer également les fichiers cachés et en lecture seule. De plus, j'ai choisi de ne pas utiliser d'alias car le PO est novice en PowerShell et peut ne pas comprendre ce qu'est un alias. gci , ? , % etc.

$limit = (Get-Date).AddDays(-15)
$path = "C:\Some\Path"

# Delete files older than the $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force

# Delete any empty directories left behind after deleting the old files.
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

Et bien sûr, si vous voulez voir quels fichiers/dossiers seront supprimés avant de les supprimer réellement, vous pouvez simplement ajouter l'option -WhatIf sur le Remove-Item à la fin des deux lignes.

Si vous voulez seulement supprimer les fichiers qui n'ont pas été mis à jour depuis 15 jours, par opposition à ceux qui ont été créés il y a 15 jours, alors vous pouvez utiliser $_.LastWriteTime au lieu de $_.CreationTime .

Le code présenté ici est compatible avec PowerShell v2.0, mais je présente également ce code et le code PowerShell v3.0, plus rapide, en tant que fonctions pratiques réutilisables sur mon blog .

37 votes

Merci de ne pas utiliser d'alias. Pour quelqu'un qui ne connaît pas powershell et qui a trouvé cet article en faisant une recherche sur Google, je considère que votre réponse est la meilleure.

1 votes

J'ai essayé la suggestion de @deadlydog et peu importe si je spécifie -15 ou -35 avec des dates de création de fichiers variables remontant à plusieurs mois (ou récentes), cela supprime l'intégralité du contenu du répertoire.

6 votes

Si les fichiers peuvent être utilisés, il est également utile d'ajouter " -ErrorAction SilentlyContinue " à la commande RemoveItem.

88voto

Esperento57 Points 8045

Tout simplement (PowerShell V5)

Get-ChildItem "C:\temp" -Recurse -File | Where CreationTime -lt  (Get-Date).AddDays(-15)  | Remove-Item -Force

19voto

Ansgar Wiechers Points 38466

Une autre façon est de soustraire 15 jours de la date actuelle et de comparer CreationTime contre cette valeur :

$root  = 'C:\root\folder'
$limit = (Get-Date).AddDays(-15)

Get-ChildItem $root -Recurse | ? {
  -not $_.PSIsContainer -and $_.CreationTime -lt $limit
} | Remove-Item

17voto

Shay Levy Points 41404

En gros, vous itérez sur les fichiers sous le chemin donné, vous soustrayez le CreationTime de chaque fichier trouvé à partir de l'heure actuelle, et de comparer avec la Days du résultat. Le site -WhatIf vous indiquera ce qui se passera sans supprimer réellement les fichiers (quels fichiers seront supprimés), retirez le commutateur pour supprimer réellement les fichiers :

$old = 15
$now = Get-Date

Get-ChildItem $path -Recurse |
Where-Object {-not $_.PSIsContainer -and $now.Subtract($_.CreationTime).Days -gt $old } |
Remove-Item -WhatIf

0 votes

Merci pour ce document, en particulier pour l'inclusion du commutateur "WhatIf" pour les tests.

10voto

Roland Jansen Points 1684

Essayez ça :

dir C:\PURGE -recurse | 
where { ((get-date)-$_.creationTime).days -gt 15 } | 
remove-item -force

0 votes

Je crois que le dernier -recurse est un de trop, non ? La liste des répertoires est récursive, la suppression de l'élément ne devrait pas se faire avec les enfants inclus, non ?

0 votes

Si le répertoire avec lequel vous travaillez est composé de deux répertoires profonds, un deuxième -recurse est nécessaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X