…mentre c’è chi sollazza in quel di Anaheim, con un nuovo tablet dotato di un windows 8 fiammante…
Ultimamente sto inserendo prepotentemente powershell nello stack tecnologico con cui ho a che fare, o meglio con cui voglio avere a che fare, nelle attività lavorative di tutti i giorni.
A “causa” di una ristrutturazione interna del nostro sistema di gestione della codebase e del processo di build (di cui parleremo in un prossimo post) ho avuto la necessità di “dumpare” tutti i nostri repository svn e zipparli per permetterne una facile archiviazione. Perchè non farlo con powershell, mi sono detto…ecco come me la sono cavata:
$svnadmin = "C:\Program Files (x86)\VisualSVN Server\bin\svnadmin.exe"
Get-ChildItem "C:\Repositories" |
Where-Object { $_.mode -match "d" } |
ForEach-Object { & $svnadmin dump $fullname |
Out-File -Encoding ASCII "C:\temp\dump\$_.svndump" }
In queste poche righe di codice si capisce la potenza espressiva di powershell…si paga un po’ in termini di verbosità, è innegabile, ma tant’è…non sono un po’ di caratteri in più a spaventarci 🙂
Un paio di commenti a margine:
- con l’operatore “” concateniamo istruzioni successive: l’output della precedente viene “riversato” come input della successiva
- l’istruzione alla riga 4 permette di filtrare tutte e solo le directory risultanti dall’operazione precedente
- con l’operatore “&” eseguiamo un comando (in questo caso svnadmin.exe)
- l’istruzione alla riga 6 fa il redirect dello standard output sul file indicato
Facile no?
La fase di “archiviazione” si è rivelata anche meno complicata e mostra esplicitamente l’integrazione tra powershell e ogni componente del .net framework. Ecco lo snippet:
[System.Reflection.Assembly]::LoadFrom("C:\temp\ICSharpCode.SharpZipLib.dll")
Get-ChildItem "C:\temp\dump" |
ForEach-Object {
$filename = "c:\temp\archive\$_.zip"
$zip = [ICSharpCode.SharpZipLib.Zip.ZipFile]::Create($filename)
$zip.BeginUpdate()
$zip.Add($_.fullname)
$zip.CommitUpdate()
$zip.Close()
}