web-dev-qa-db-fra.com

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

Je souhaite supprimer uniquement les fichiers créés il y a plus de 15 jours dans un dossier particulier. Comment puis-je faire cela avec PowerShell?

166
user2470170

Les réponses données ne supprimeront que les fichiers (ce qui est certes ce qui est dans le titre de ce message), 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 auraient pu être laissés. derrière. Mon code utilise également l'option -Force pour supprimer les fichiers masqués et en lecture seule. De plus, j'ai choisi de ne pas utiliser d'alias, car l'OP est nouveau dans PowerShell et je ne comprends pas ce que sont 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, vous pouvez simplement ajouter le commutateur -WhatIf à l'appel Remove-Item à la fin des deux lignes.

Le code présenté ici est compatible avec PowerShell v2.0, mais j’affiche également ce code et le code plus rapide PowerShell v3.0 sous la forme fonctions réutilisables pratiques sur mon blog .

274
deadlydog

tout simplement (PowerShell V5)

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

Une autre méthode consiste à soustraire 15 jours à la date du jour et à comparer CreationTime avec cette valeur:

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

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

En gros, vous parcourez les fichiers du chemin indiqué, soustrayez le CreationTime de chaque fichier trouvé à partir de l'heure actuelle et comparez-le à la propriété Days du résultat. Le commutateur -WhatIf vous dira ce qui se passera sans supprimer réellement les fichiers (quels fichiers seront supprimés), supprimez 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
13
Shay Levy

Essaye ça:

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

Le script Esperento57 ne fonctionne pas dans les anciennes versions de PowerShell. Cet exemple fait:

Get-ChildItem -Path "C:\temp" -Recurse -force -ErrorAction SilentlyContinue | where {($_.LastwriteTime -lt  (Get-Date).AddDays(-15) ) -and (! $_.PSIsContainer)} | select name| Remove-Item -Verbose -Force -Recurse -ErrorAction SilentlyContinue
5
KERR

Une autre alternative (15. se tape automatiquement sur [timespan]):

ls -file | where { (get-date) - $_.creationtime -gt 15. } | Remove-Item -Verbose
2
js2010
$limit = (Get-Date).AddDays(-15)
$path = "C:\Some\Path"

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

Cela supprimera les anciens dossiers et leur contenu.

1
Aigar

Si vous rencontrez des problèmes avec les exemples ci-dessus sous Windows 10, essayez de remplacer .CreationTime par .LastwriteTime. Cela a fonctionné pour moi.

dir C:\locationOfFiles -ErrorAction SilentlyContinue | Where { ((Get-Date)-$_.LastWriteTime).days -gt 15 } | Remove-Item -Force
0
Jeff Blumenthal