2012-01-10 6 views
16

Sto provando a scrivere uno script che guarderà attraverso una serie di cartelle e manterrà solo gli ultimi 10 file. I file in ogni cartella possono essere creati giornalmente, settimanalmente o mensilmente. Ho bisogno che lo script tenga le 10 copie più recenti indipendentemente dalla data di creazione o dalla data di modifica.Mantenere x il numero di file e cancellare tutti gli altri - Powershell

Utilizzando un altro post ho creato lo script seguente che funziona ma non mantiene 10 copie mantiene qualsiasi file che non è più vecchio di 10 giorni.

$ftppath = "C:\Reports" 
Get-ChildItem $ftppath -recurse *_Report_*.zip -force|where {$_.lastwritetime -lt (get-date).adddays(-10)} |Remove-Item -force 

Qualche idea su come posso modificare questo per funzionare? Se uso lo script qui sotto funziona ma solo se non ho impostato -Recurse. Se si utilizza l'opzione -Recurse, si ottiene un errore che ho elencato sotto lo script.

# Keeps latest 10 files from a directory based on Creation Time 

#Declaration variables 
$path = "C:\Reports"        # For example $path= C:\log\*.tmp 
$total= (ls $path).count - 10 # Change number 5 to whatever number of objects you want to keep 
# Script 
ls $path |sort-object -Property {$_.CreationTime} | Select-Object -first $total | Remove-Item -force 

Error: Select-Object : Cannot validate argument on parameter 'First'. The -7 argument is less than the minimum allowed range of 0. Supply an argument that is greater than 0 and then try the command again.

risposta

32

È possibile ordinare per CreationTime discendente e saltare il primo 10. Se ci sono meno di 10 file non ne rimuoverà nessuno.

gci C:\temp\ -Recurse| where{-not $_.PsIsContainer}| sort CreationTime -desc| 
    select -Skip 10| Remove-Item -Force 
+1

Ah '-Skip'. Bello e conciso :-) +1 –

+0

Stavo testando questo e ottenuto alcuni risultati strani, non sono sicuro di cosa stava succedendo lì ... Riscontrato e funziona come mi aspetterei. Nizza 1 fodera. –

+0

@Andy - sì, ho provato il tuo codice per creare file, e la seconda volta che l'ho eseguito, The creationTime non è stato aggiornato per tutti i file. Non so esattamente perché però: -/ – Rynant

8

Aggiornato

$path = "C:\TestDir" 

# Create 12 test files, 1 second after each other 
1..12 | % { 
    Remove-Item -Path "$path\$_.txt" -ea SilentlyContinue 
    $_ | Out-File "$path\$_.txt" 
    Start-Sleep -Seconds 1 
} 

$files = Get-ChildItem -Path $path -Recurse | Where-Object {-not $_.PsIsContainer} 
$keep = 10 
if ($files.Count -gt $keep) { 
    $files | Sort-Object CreationTime | Select-Object -First ($files.Count - $keep) | Remove-Item -Force -WhatIf 
} 

rimuovere il parametro -WhatIf-Remove-Item quando il tuo pronto a eliminare per davvero.

+0

Non rimuove tutti i file? – Rynant

+0

Ah grazie, la vecchia versione lo farebbe. Aiuta a testare di più ;-) Ho aggiornato con una versione funzionante testata. –

+0

Grazie per l'aiuto. Questo è ora in esecuzione come previsto. Grazie ancora. – mpowmap

1

@Andy: la mia risposta è troppo bassa per commentare in modo da pubblicare una risposta. Se stai ottenendo risultati strani, potrebbe essere perché stai cercando in Windows Explorer che per impostazione predefinita mostra la data dell'ultima modifica invece della data di creazione. Per ottenere risultati coerenti con quelli mostrati in Esplora risorse, scambia LastWriteTime per CreationTime in questo modo: gci C: \ temp \ -Recurse | dove {-not $ _. PsIsContainer} | ordina LastWriteTime -desc | selezionare -Skip 10 | Remove-Item -Force