Je souhaite supprimer uniquement les fichiers créés il y a plus de 15 jours dans un dossier particulier. Comment pourrais-je faire cela en utilisant PowerShell?
powershell
powershell-2.0
powershell-3.0
user2470170
la source
la source
Réponses:
Les réponses données ne supprimeront que les fichiers (ce qui est certes ce qui est dans le titre de cet article), mais voici un code qui supprimera d'abord tous les fichiers datant 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 l'
-Force
option de supprimer les fichiers cachés et en lecture seule. , J'ai choisi aussi de ne pas utiliser les alias que l'OP est nouveau pour PowerShell et peut ne pas comprendre ce quegci
,?
,%
, etc. sont.$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
-WhatIf
commutateur à l'Remove-Item
appel de l' applet de commande à la fin des deux lignes.Le code présenté ici est compatible avec PowerShell v2.0, mais je montre également ce code et le code PowerShell v3.0 plus rapide en tant que fonctions réutilisables pratiques sur mon blog .
la source
tout simplement (PowerShell V5)
Get-ChildItem "C:\temp" -Recurse -File | Where CreationTime -lt (Get-Date).AddDays(-15) | Remove-Item -Force
la source
Une autre méthode consiste à soustraire 15 jours de la date actuelle 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
la source
Fondamentalement, vous parcourez les fichiers sous le chemin donné, soustrayez la valeur
CreationTime
de chaque fichier trouvé de l'heure actuelle et comparez avec laDays
propriété du résultat. Le-WhatIf
commutateur 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
la source
Essaye ça:
dir C:\PURGE -recurse | where { ((get-date)-$_.creationTime).days -gt 15 } | remove-item -force
la source
-recurse
est un de trop, non? La liste des répertoires est récursive, la suppression de l'élément ne doit pas être incluse avec les enfants, non?Le script d'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
la source
Une autre alternative (15. est automatiquement tapé sur [timepan]):
ls -file | where { (get-date) - $_.creationtime -gt 15. } | Remove-Item -Verbose
la source
$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 son contenu.
la source
#----- Define parameters -----# #----- Get current date ----# $Now = Get-Date $Days = "15" #----- define amount of days ----# $Targetfolder = "C:\Logs" #----- define folder where files are located ----# $Extension = "*.log" #----- define extension ----# $Lastwrite = $Now.AddDays(-$Days) #----- Get files based on lastwrite filter and specified folder ---# $Files = Get-Children $Targetfolder -include $Extension -Recurse | where {$_.LastwriteTime -le "$Lastwrite"} foreach ($File in $Files) { if ($File -ne $Null) { write-host "Deleting File $File" backgroundcolor "DarkRed" Remove-item $File.Fullname | out-null } else write-host "No more files to delete" -forgroundcolor "Green" } }
la source
$Files
est vide, elle n'entrera pas dans l' instruction foreach . Vous devez placer le foreach dans l' instruction if .Si vous rencontrez des problèmes avec les exemples ci-dessus sur une boîte 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
la source
LastwriteTime
n'est pas la même chose queCreationTime
,LastwriteTime
est mise à jour chaque fois que le fichier est modifié.