20/02/2010

Visualizzare l'output pagina per pagina

A cura di Efran Cobisi
Tag: Output


Lavorando con la console si corre spesso il rischio di ricevere troppe informazioni in una volta sola, arrivando magari al punto di perderne qualcuna; PowerShell dispone di due tecniche differenti per visualizzare l'output pagina per pagina ma solo una delle due gestisce grandi moli di dati senza alcun calo di performance.

Sia all’interno di CMD che di COMMAND.COM che della maggior parte delle shell di derivazione *nix è presente un comando in grado di effettuare la paginazione dei dati forniti tramite pipe: si tratta di more. Poiché all’interno dei sistemi Windows è un eseguibile a sé stante, more è facilmente richiamabile ed integrabile anche nella pipeline di PowerShell; eseguendo lo script che segue, ad esempio, more visualizza l’output del comando Get-ChildItem, pagina per pagina:

PS C:\Users\ikmju> Get-ChildItem | more

    Directory: Microsoft.PowerShell.Core\FileSystem::C:\Users\ikmju

Mode           LastWriteTime       Length Name
----           -------------       ------ ----
d-r--    10/21/2009  7:11 AM        <DIR> Contacts
d-r--     2/18/2010  6:21 PM        <DIR> Desktop
d-r--     1/30/2010 11:02 AM        <DIR> Documents

[...]

-- More  --

Poiché more è un eseguibile nativo, tuttavia, la shell è costretta a lanciarlo solo dopo aver “catturato” tutto l’output generato dai blocchi precedenti della pipeline; quando le informazioni sono poche – nell’ordine di qualche migliaio di righe – questo calo di performance tipicamente non si nota. Nel caso in cui, però, la numerosità dei dati sia elevata si potrebbe notare un discreto aumento del tempo richiesto prima di visualizzare qualcosa a video. Anche la memoria, in questa circostanza, potrebbe risentirne: i dati provenienti dalla pipeline, infatti, verrebbero salvati in un buffer nell’attesa del termine dell’elaborazione, per poi alimentare more.

È sufficiente sfruttare la modalità -Recurse di Get-ChildItem per verificare questo problema di performance: prima di visualizzare qualcosa a video potrebbero passare anche diversi minuti e il grafico del consumo della memoria continuerebbe a puntare verso l’alto!

Get-ChildItem C:\ -Recurse | more

PowerShell risolve elegantemente questo problema offrendo il supporto per la paginazione direttamente all’interno del cmdlet di output Out-Host; usufruendo dello switch -Paging, infatti, questo comando è in grado di visualizzare quanto prodotto dalla pipeline un oggetto alla volta, evitando la necessità di utilizzare un buffer per memorizzarne l’intero risultato. Impiegando la pagina di Out-Host, infatti, i dati sono visualizzati appena vengono emessi dalla pipeline: le performance sono elevate ed il consumo di memoria è ridotto al minimo, senza alcun picco.

Get-ChildItem C:\ -Recurse | Out-Host -Paging

Quando Out-Host è in attesa di input da parte dell’utente (per procedere con la visualizzazione) anche l’elaborazione della pipeline è sospesa; questo cmdlet, infatti, è in grado di gestire il flusso di esecuzione degli oggetti in maniera tale da rendere quanto più performante possibile l’intera attività di visualizzazione.

Commenti



Nessun commento disponibile.

EmailVerify.NET is a Microsoft .NET software component that validates e-mail addresses. valid email