<invidia mode=”on”>
…mentre c’è chi sollazza in quel di Anaheim, con un nuovo tablet dotato di un windows 8 fiammante…
</invidia>
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
[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() }
by Emanuele Delbono
15 Sep 2011 at 17:54
Bello eh…però in Ruby:
Dir.glob(“C:\\Repositories\*”).each do |f|
sh “svnadmin dump #{f} > #{f}.dump”
end
meno codice e soprattutto molto più leggibile.
by melkio
16 Sep 2011 at 23:04
Se mi dici che è più conciso, ti posso anche dare ragione (anche se il redirect dallo standar output si può fare anche in powershell con il “>”), ma sulla leggibilità potrei avere qualche dubbio…ma de gustibus…
Per curiosità…nel tuo script mi manca un pezzo: dove estrai solo e soltanto le sottodirectory di “c:\repositories”. Quella folder contiene file (da non considerare) e sub-folder.
by Emanuele Delbono
19 Sep 2011 at 18:10
Ho dimenticato un *
Dir.glob(“C:\\Repositories\**\”).each do |f|
sh “svnadmin dump #{f} > #{f}.dump”
end
comunque ok “de gustibus”…però….
Pingback
by M# blog » Redirect di dati binari con powershell
20 Sep 2011 at 09:25
[...] [...]