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?
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 .
tout simplement (PowerShell V5)
Get-ChildItem "C:\temp" -Recurse -File | Where CreationTime -lt (Get-Date).AddDays(-15) | Remove-Item -Force
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
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
Essaye ça:
dir C:\PURGE -recurse |
where { ((get-date)-$_.creationTime).days -gt 15 } |
remove-item -force
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
Une autre alternative (15. se tape automatiquement sur [timespan]):
ls -file | where { (get-date) - $_.creationtime -gt 15. } | Remove-Item -Verbose
$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.
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