do not use write-host cmdlet

Se non fosse ancora chiaro: non usate la cmdlet write-host! Non pensiate che sia la solita affermazione avventata, bensì, il motivo di questa affermazione ha radici profonde. Innanzitutto, chi usa Powershell, deve imprimere nella sua mente un concetto fondamentale:

Powershell is about automation

Questo significa che gli script Powershell che scriviamo devono essere sempre pensati con l’obiettivo di automatizzarli. Ed in questo contesto, la cmdlet Write-Host non ha nulla in comune con l’automatizzazione. Per capire le ragioni di questa affermazione occorre indagare sul funzionamento di Write-Host. Per cominciare, in Powershell esistono differenti message stream:

  1. Output/Success
  2. Error
  3. Warning
  4. Verbose
  5. Debug

Per scrivere all’interno di questi stream si possono invece usare le seguenti cmdlet (numerate in base all’ordine precedente):

  1. Write-Output
  2. Write-Error
  3. Write-Warning
  4. Write-Verbose
  5. Write-Debug

Da qui si evince che Write-Host non è associato a nessuno di questi stream! Questo significa che Write-Host non passa all’interno di nessun message stream, ma le informazioni che gli vengono date saranno sparate direttamente nella console. Quindi questo è l’unico contesto in cui è consigliabile usarla. Ovvero, se abbiamo necessità di creare uno script che non sia automatizzato ma interattivo, in cui l’utente deve interagire, allora Write-Host va bene. Jeffrey Snover, il padre di Powershell, nell’articolo che trovate a fine articolo, consiglia di usarlo per i soli script che saranno poi gettati. In tutti gli altri casi, è consigliabile l’uso di Write-Output. Se vogliamo invece dare la possibilità all’utente di scegliere la quantità di informazioni da mostrare a video o nei file di log, usiamo Write-Verbose.

Per avere un riscontro reale del funzionamento di Write-Host, possiamo usare la seguente cmdlet all’interno di una console:

All’interno del file log.txt troviamo solo l’output di Write-Output ma non di Write-Host. Naturalmente possiamo barare ed eseguire il comando con Write-Messages *> C:\Temp\log.txt.  In questo modo forziamo la scrittura di Write-Host all’interno del file tramite gli operatori di redirezione (ndr: ho notato questo comportamento solo in PS 5). Ma se volete un consiglio spensierato: non fatelo!

Notate che anche la cmdlet Write-Output può scrivere all’interno della console! L’unica differenza è che le informazioni passeranno all’interno dello stream di Output (in formato object) e possono essere riutilizzate per altro (attraverso il piping). Nel caso in cui Write-Output non è seguita da altro, saranno allora visualizzate nella console grazie ad Out-Default. Di sicuro l’unica caratteristica che perdiamo con Write-Output è la possibilità di formattare (o meglio colorare) il testo di output per la console. Però con un po’ di fantasia, possiamo crearci una cmdlet che consenta la colorazione dell’output nella console (ho preso spunto da questo post su Stack-Overflow: http://stackoverflow.com/questions/4647756/is-there-a-way-to-specify-a-font-color-when-using-write-output):

Approfondimenti

Write-Host considered harmful: http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/

2 Responses to do not use write-host cmdlet

  1.  
  2.  

leave your comment