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?
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?
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 que gci
, ?
, %
, 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 .
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 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
Fondamentalement, vous parcourez les fichiers sous le chemin donné, soustrayez la valeur CreationTime
de chaque fichier trouvé de l'heure actuelle et comparez avec la Days
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
Essaye ça:
dir C:\PURGE -recurse |
where { ((get-date)-$_.creationTime).days -gt 15 } |
remove-item -force
-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
#----- 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"
}
}
$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
LastwriteTime
n'est pas la même chose que CreationTime
, LastwriteTime
est mise à jour chaque fois que le fichier est modifié.