Hay varias formas diferentes de enviar mensajes. ¿Cuál es la diferencia entre la salida de efectivo a través de algo Write-Host
, Write-Output
o [console]::WriteLine
?
También noto que si uso:
write-host "count=" + $count
El +
se incluye en la salida. ¿Porque eso? ¿No debería evaluarse la expresión para producir una sola cadena concatenada antes de que se escriba?
powershell
Scott Langham
fuente
fuente
Write-Output
cuando estás emitiendo resultados.Write-Host
cuando estás emitiendo información de registro. Nunca lo use[console]::writeline()
.[console]::writeline("hello world")
que no puedas hacerWrite-Host "hello world"
. Otra respuesta mejor y más reciente aplicable es que sewrite-host
envuelvewrite-information
para que sus datos se pongan en una secuencia comowrite-error
para que pueda capturarlos y usarlos en otro lugar.[console]::writeline()
no hace esoRespuestas:
Write-Output
debe usarse cuando desea enviar datos en la tubería, pero no necesariamente quiere mostrarlos en la pantalla. La tubería eventualmente lo escribiráout-default
si nada más lo usa primero.Write-Host
debe usarse cuando quieres hacer lo contrario.[console]::WriteLine
es esencialmente lo queWrite-Host
está haciendo detrás de escena.Ejecute este código de demostración y examine el resultado.
Deberá encerrar la operación de concatenación entre paréntesis, de modo que PowerShell procese la concatenación antes de tokenizar la lista de parámetros
Write-Host
o utilice la interpolación de cadenasPor cierto, mira este video de Jeffrey Snover explicando cómo funciona la tubería. Cuando comencé a aprender PowerShell, descubrí que esta era la explicación más útil de cómo funciona la canalización.
fuente
Write-Output
es el valor predeterminado, por ejemplo, si tiene un PsObject y lo escupe en la pantalla haciendo esto$object
, en realidad hará lo mismo que estoWrite-Output $object
. Vale la pena mencionarWrite-Output
cuando sea posible. Consulte github.com/PoshCode/PowerShellPracticeAndStyle/issues/… > Use return solo para finalizar la ejecución. > Evitar escritura de salida (...). En cambio, cuando desee aclarar la salida, simplemente asigne la salida a una variable con un nombre relevante. y coloca una variable en una línea por sí misma para indicar una salida explícita. > Write-Output -NoEnumerate está roto en PowerShell 6 y lo ha estado durante 16 meses o más; no hay ningún plan para solucionarlo. En resumen:> NO USE la salida de escritura - NUNCA.Además de lo que Andy mencionó, hay otra diferencia que podría ser importante: write-host escribe directamente al host y no devuelve nada, lo que significa que no puede redirigir la salida, por ejemplo, a un archivo.
Ahora ejecute en PowerShell:
Como se ve, no puede redirigirlos a un archivo. Esto puede sorprender a alguien que no tiene cuidado.
Pero si se cambia para usar la salida de escritura en su lugar, obtendrá la redirección funcionando como se esperaba.
fuente
Aquí hay otra forma de lograr el equivalente de Write-Output. Simplemente ponga su cadena entre comillas:
Puede asegurarse de que esto funcione igual que Write-Output ejecutando este experimento:
Los dos primeros generarán "bla, bla" en out.txt, pero el tercero no.
"help Write-Output" da una pista de este comportamiento:
En este caso, la cadena en sí "count = $ count" es el objeto al final de una tubería y se muestra.
fuente
Para usos de
Write-Host
,PSScriptAnalyzer
produce el siguiente diagnóstico:Consulte la documentación detrás de esa regla para obtener más información. Extractos para la posteridad:
Jeffrey Snover tiene una publicación en el blog Write-Host Considerado dañino en el que afirma que Write-Host es casi siempre algo incorrecto porque interfiere con la automatización y proporciona más explicaciones detrás del diagnóstico, sin embargo, lo anterior es un buen resumen.
fuente
Según mis pruebas, Write-Output y [Console] :: WriteLine () funcionan mucho mejor que Write-Host.
Según la cantidad de texto que necesite escribir, esto puede ser importante.
A continuación, si el resultado de 5 prueba cada uno para Write-Host, Write-Output y [Console] :: WriteLine ().
En mi experiencia limitada, descubrí que cuando trabajo con cualquier tipo de datos del mundo real necesito abandonar los cmdlets e ir directamente a los comandos de nivel inferior para obtener un rendimiento decente de mis scripts.
fuente
Write-Output
yWrite-Host
sirven para diferentes propósitos, por lo que no tiene sentido comparar su desempeño. Sí, el uso directo de los tipos .NET y sus métodos es más rápido, pero se pierde las funciones de nivel superior que pueden proporcionar los cmdlets de PowerShell.[Console]::WriteLine()
es similar alWrite-Host
caso en cuestión, pero no funcionará en todas las circunstancias, porque no todos los hosts de PowerShell son consolas .Con respecto a [Console] :: WriteLine (): debe usarlo si va a usar tuberías en CMD (no en powershell). Digamos que desea que su ps1 transmita una gran cantidad de datos para stdout, y alguna otra utilidad para consumirla / transformarla. Si usa Write-Host en el script, será mucho más lento.
fuente