Búsqueda de sitios web

Descripción del cmdlet Write-Host de PowerShell


A lo largo de los años, ha habido mucho debate en torno al cmdlet Write-Host de PowerShell sobre si es necesario usarlo. Como en la mayoría de los casos, la respuesta es tal vez y depende de tus necesidades.

Para comprender Write-Host y cuándo usarlo, exploremos rápidamente el historial de Write-Host y aprendamos cuál es la mejor manera de utilizar este útil cmdlet.

Uso moderno de PowerShell Write-Host

A menudo, en un script o función de PowerShell, es necesario convertir información para un usuario sobre lo que está sucediendo que es informativa y no se relaciona directamente con el resultado de una función.

¿Por qué decimos el uso moderno de Write-Host? Antes de PowerShell 5.x, Write-Host no estaba vinculado a la transmisión (como las transmisiones de éxito, error o advertencia). Por lo tanto, se desaconsejó su uso ya que no era tan controlable como los otros tipos de salida.

Tomemos este ejemplo simple de una secuencia de comandos que le brinda al usuario información sobre cuánto tiempo llevará procesar una secuencia de comandos.

Write-Host "Starting the gathering of information, be patient, this could take a while!"
Write-Host "- Gathering Process`r`n- Gathering Files`r`n- Gathering Users"
Write-Output "Display the information here..."
Write-Host "Information Gathering Complete!"

Notará que esto simplemente envía información al host que el usuario final de su script puede utilizar para tomar decisiones adicionales. Es posible que se encuentre preguntando sobre el contenido de la canalización.

Si envía objetos de un cmdlet o función a otro, pero aún desea mostrar mensajes informativos, ¿puede hacerlo? Afortunadamente, el cmdlet Write-Host de PowerShell no afecta la salida de la canalización. Mostremos cómo funciona eso a continuación.

Function Get-Information {
  Write-Host "Starting the gathering of information, be patient, this could take a while!`r`n"
  Write-Host "- Gathering Data`r`n- Returning Data`r`n"

  [PSCustomObject]@{
    "Test1" = "Value1"
    "Test2" = "Value2"
  }

  Write-Host "Information Gathering Complete!"
}

Function Convert-Information {
  Param(
    [Parameter(ValueFromPipeline=$true)]$Param
  )

  $Param | ConvertTo-JSON
}

Si canaliza la salida de Get-Information a Convert-Information, no tendrá en cuenta ninguna de las declaraciones y solo operará en PSCustomObject eso es salida.

Formatear mensajes para facilitar su lectura

Otro aspecto muy útil de Write-Host es la capacidad de formatear colores y resultados. Dado que esto se puede utilizar para facilitar la lectura, puede ayudar enormemente a los usuarios de scripts de PowerShell a comprender qué está sucediendo y cuándo es necesario tomar medidas.

  • -ForegroundColor: el color del texto de información.
  • -BackgroundColor: el color del fondo detrás del texto.
  • -Separator: para los objetos que se generan como Write-Host, utilice el separador proporcionado en lugar de un espacio. Puede ser un retorno de carro y un carácter de nueva línea como "rn".
  • -NoNewLine: no genera un carácter de nueva línea al final de la salida.

Exploremos cómo podemos construir un mensaje de información útil aprovechando los diversos parámetros de formato. En el siguiente código, estamos construyendo un mensaje informativo sobre la cantidad de resultados de una matriz y aplicamos formato para que sea más fácil de ver.

Se pueden pasar varios objetos a Write-Host para mostrarlos como se ve a continuación. Normalmente, un scripter separará estos mensajes con un espacio, pero con el parámetro separator, puede controlar cómo se envían a la consola.

$Array = @(1,2,3,4,5)

Write-Host "Results Count:" -BackgroundColor DarkBlue -ForegroundColor White -NoNewline
Write-Host "" $Array.Count "Items`r`n" -ForegroundColor Red
Write-Host $Array -Separator "`r`n"
Write-Host "" "End of results." -ForegroundColor Green -Separator "`r`n"

Al controlar la salida con colores, nueva línea y salida de separador, podemos crear un mensaje útil que brindará información sobre el script al usuario. Un ejemplo de este escenario es cuando crea un menú informativo, entre otros casos de uso.

Redirigir la salida de la secuencia Write-Host

Dado que Write-Host ahora es controlable mediante la salida del flujo, existen algunas formas de controlar y redirigir la salida. La preferencia InformationAction se tiene en cuenta en parte con los mensajes Write-Host. -InformationAction Ignore suprimirá efectivamente los mensajes Write-Host, pero el parámetro $InformationPreference y InformationAction no afecta la Cmdlet Write-Host.

¿Sabías que Write-Host es solo un contenedor del cmdlet Write-Information? Esto permite que la salida de Write-Host esté contenida dentro del flujo de información. Esto significa que puede modificar dónde van los mensajes Write-Host utilizando el flujo de información.

Dicho esto, aún puedes redirigir la salida de los mensajes Write-Host a una secuencia diferente utilizando los operadores de redirección. Por ejemplo, envíe todos los mensajes Write-Host a un archivo de registro. Tomando el mismo ejemplo visto arriba, redirijamos toda esa salida a un archivo de registro.

Write-Host "Results Count:" -BackgroundColor DarkBlue -ForegroundColor White -NoNewline 6>> .\log.txt
Write-Host "" $Array.Count "Items`r`n" -ForegroundColor Red 6>> .\log.txt
Write-Host $Array -Separator "`r`n" 6>> .\log.txt
Write-Host "" "End of results." -ForegroundColor Green -Separator "`r`n" 6>> .\log.txt

Como puede ver, PowerShell ahora redirige la salida a un registro, pero es posible que el formato no sea exactamente el deseado. Esto se debe a que el parámetro -NoNewLine no se respeta realmente, ya que es principalmente una herramienta de formato de host. Puede que esto no sea gran cosa, pero es algo a tener en cuenta al redirigir la salida de la transmisión.

Conclusión

Con los cambios en PowerShell 5.x y posteriores, se permite perfectamente el uso de Write-Host y se recomienda cuando es necesario mostrar mensajes informativos al usuario. Dado que un usuario de PowerShell tendrá el nivel necesario de control sobre un mensaje informativo al igual que un mensaje de salida o detallado, se recomienda el uso de Write-Host o Write-Information. y recomendado para su uso según sea necesario.

Artículos relacionados