Vorrei eliminare solo i file creati più di 15 giorni fa in una cartella specifica. Come potrei farlo usando PowerShell?
Vorrei eliminare solo i file creati più di 15 giorni fa in una cartella specifica. Come potrei farlo usando PowerShell?
Risposte:
Le risposte fornite elimineranno solo i file (che è certamente quello che è nel titolo di questo post), ma ecco un codice che eliminerà prima tutti i file più vecchi di 15 giorni, quindi eliminerà ricorsivamente tutte le directory vuote che potrebbero essere state lasciate dietro a. Il mio codice utilizza anche l' -Force
opzione per eliminare anche i file nascosti e di sola lettura. Inoltre, ho scelto di non utilizzare alias come il PO è nuovo a PowerShell e non può capire cosa gci
, ?
, %
, ecc sono.
$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
E, naturalmente, se si desidera vedere quali file / cartelle verranno eliminati prima di eliminarli, è possibile aggiungere il -WhatIf
passaggio alla Remove-Item
chiamata del cmdlet alla fine di entrambe le linee.
Il codice mostrato qui è compatibile con PowerShell v2.0, ma mostro anche questo codice e il codice PowerShell v3.0 più veloce come utili funzioni riutilizzabili sul mio blog .
semplicemente (PowerShell V5)
Get-ChildItem "C:\temp" -Recurse -File | Where CreationTime -lt (Get-Date).AddDays(-15) | Remove-Item -Force
Un altro modo è sottrarre 15 giorni dalla data corrente e confrontarlo CreationTime
con quel valore:
$root = 'C:\root\folder'
$limit = (Get-Date).AddDays(-15)
Get-ChildItem $root -Recurse | ? {
-not $_.PSIsContainer -and $_.CreationTime -lt $limit
} | Remove-Item
Fondamentalmente, si esegue l'iterazione sui file nel percorso specificato, si sottrae il valore CreationTime
di ciascun file trovato dall'ora corrente e si confronta con la Days
proprietà del risultato. Lo -WhatIf
switch ti dirà cosa accadrà senza effettivamente eliminare i file (quali file verranno eliminati), rimuovi lo switch per eliminare effettivamente i file:
$old = 15
$now = Get-Date
Get-ChildItem $path -Recurse |
Where-Object {-not $_.PSIsContainer -and $now.Subtract($_.CreationTime).Days -gt $old } |
Remove-Item -WhatIf
Prova questo:
dir C:\PURGE -recurse |
where { ((get-date)-$_.creationTime).days -gt 15 } |
remove-item -force
-recurse
sia uno di troppo, no? L'elenco dir è ricorsivo, la cancellazione dell'articolo non dovrebbe essere inclusa con i bambini, giusto?
Lo script di Esperento57 non funziona nelle versioni precedenti di PowerShell. Questo esempio fa:
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
Se riscontri problemi con gli esempi sopra riportati su una scatola di Windows 10, prova a sostituirlo .CreationTime
con .LastwriteTime
. Questo ha funzionato per me.
dir C:\locationOfFiles -ErrorAction SilentlyContinue | Where { ((Get-Date)-$_.LastWriteTime).days -gt 15 } | Remove-Item -Force
LastwriteTime
non è lo stesso di CreationTime
, LastwriteTime
viene aggiornato ogni volta che il file viene modificato.
#----- 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
è vuota non inserirà l' istruzione foreach . Dovresti inserire la foreach nell'istruzione if .