Uso: yourScript.ps1 -Path path \ to \ run \ em relação a [-NumberToSave N]
param([String]$Path,[Int32]$NumberToSave=5)
$items = Get-ChildItem "$Path\*.ext" |
Where-Object Name -match "\d\d\d\d\d\d\d\d-\d\d\d\d\.ext" |
Sort-Object Name -Descending
if ($NumberToSave -lt $items.Count)
{
$items[$NumberToSave..($items.Count-1)] | Remove-Item
}
Eu não espero que isso seja realmente melhor do que o de @ John, eu acabei de fazer isso para testar os parâmetros, regexp e não usar um loop. Fazer uma correspondência regex tem o benefício de excluir outros arquivos com .ext que não correspondam ao formato (por exemplo, 20130504-1200.txt.ext, 20.ext), mas é duvidoso que isso se aplique.
Fiquei chateado ao descobrir que se $ NumberToSave = $ items.Count, em seguida, a declaração if é necessária, caso contrário, não estaria lá. Tecnicamente:
$items[$numberToSave..$items.Count] | Remove-Item
funciona bem (o PowerShell não parece errar se você faz referência aos limites da matriz, apenas os manipula e ignora), mas isso parecia potencialmente confuso.