Ciao Simbo, ogni tanto ci si vede, eh? ;)
Allora, inizio dicendoti che sono d'accordo con te sul fatto che ci sia margine di miglioramento sullo script; creare il file .zip vuoto andando a scriverne l'header non è una pratica molto elegante e porta a notevoli problemi di leggibilità e di manutenzione del tuo codice.
L'implementazione della compressione/decompressione .zip offerta dalla shell (non PowerShell ma l'oggetto COM che rappresenta la shell di Windows) non è poi tra le migliori perchè è davvero molto scarna e poco performante.
Noto anche che potrebbero esserci dei problemi di lock del file .zip: è per questo che effettui uno Start-Sleep da mezzo secondo tra un file e l'altro?
Inoltre, recuperare due volte il set di file di input porta a qualche problema di performance e remoti casi di discrepanze sulle date di ultima scrittura (dato sempre modificabile).
Detto questo, penso che la migliore soluzione nel tuo caso sia quella di utilizzare PSCX, le estensioni open source per PowerShell hostate su CodePlex. Con questa premessa ho riscritto la tua funzione così:
function Archive-Folder
{
param([string]$inputFolder = $(throw 'Cartella di input non specificata.'),
[string]$outputFolder = $(throw 'Cartella di output non specificata.'))
$inputFiles = Get-ChildItem $inputFolder -Recurse -Force |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-14) }
if ($inputFiles -eq $null) {
return
}
$inputFiles |
Write-Zip -OutputPath "$outputFolder\Backup-$(Get-Date -f yyyyMMddTHHmmss).zip"
$inputFiles |
Remove-Item -Force
}
Devo dire che mi sono anche divertito... :)
Il cmdlet principale su cui si appoggia la funzione è Write-Zip; avrei naturalmente preferito scrivere un one-liner ma lo switch -RemoveOriginal di questo cmdlet, su cui pensavo di fare affidamento, è stato rimosso dall'ultima release ed in quella precedente era stato disabilitato.
Fa niente, penso che lo script sia comunque leggibile.
La funzione è richiamabile così:
Archive-Folder C:\Input C:\Backup
Ciao, a presto!