usar tutorial script como commands comandos powershell

powershell - tutorial - ¿Qué debo usar: "Write-Host", "Write-Output", o "[console]:: WriteLine"?



powershell tutorial (4)

Además de lo que Andy mencionó, hay otra diferencia que podría ser importante: write-host escribe directamente en el host y no devuelve nada, lo que significa que no puede redirigir la salida, por ejemplo, a un archivo.

---- script a.ps1 ---- write-host "hello"

Ahora ejecuta en PowerShell:

PS> ./a.ps1 > someFile.txt hello PS> type someFile.txt PS>

Como se ve, no puede redirigirlos a un archivo. Esto tal vez sea sorprendente para alguien que no tiene cuidado.

Pero si cambia para usar escritura-salida en su lugar, obtendrá la redirección funcionando como se espera.

Estoy tratando de entender a PowerShell. Una cosa simple que estoy luchando por resolver es que parece haber varias formas diferentes de generar mensajes. ¿Qué debería usar y cuál es la diferencia, y existe una forma convencional de hacerlo?

También noté 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?


Aquí hay otra forma de lograr el equivalente de Write-Output. Simplemente ponga su cadena entre comillas:

"count=$count"

Puede asegurarse de que esto funcione igual que Write-Output ejecutando este experimento:

"blah blah" > out.txt Write-Output "blah blah" > out.txt Write-Host "blah blah" > out.txt

Los dos primeros producirán "bla bla" en out.txt, pero el tercero no.

"help Write-Output" da una pista de este comportamiento:

Este cmdlet se usa generalmente en scripts para mostrar cadenas y otros objetos en la consola. Sin embargo, como el comportamiento predeterminado es mostrar los objetos al final de una interconexión, generalmente no es necesario usar el cmdlet.

En este caso, la cadena en sí misma "count = $ count" es el objeto al final de una tubería, y se muestra.


De mi prueba 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 pruebas para Write-Host, Write-Output y [Console] :: WriteLine ().

En mi experiencia limitada, he descubierto que cuando trabajo con cualquier tipo de datos del mundo real, tengo que abandonar los cmdlets e ir directamente a los comandos de nivel inferior para obtener un rendimiento decente de mis scripts.

measure-command {$count = 0; while ($count -lt 1000) { Write-Host "hello"; $count++ }} 1312ms 1651ms 1909ms 1685ms 1788ms measure-command { $count = 0; while ($count -lt 1000) { Write-Output "hello"; $count++ }} 97ms 105ms 94ms 105ms 98ms measure-command { $count = 0; while ($count -lt 1000) { [console]::WriteLine("hello"); $count++ }} 158ms 105ms 124ms 99ms 95ms


Write-Output debe utilizar cuando desee enviar datos en la línea de tubería, pero no necesariamente desea mostrarlo en la pantalla. Eventualmente, la tubería la escribirá en out-default si nada más la usa primero. Write-Host debe usarse cuando desee hacer lo contrario. [console]::WriteLine es esencialmente lo que Write-Host está haciendo detrás de escena.

Ejecute este código de demostración y examine el resultado.

function Test-Output { Write-Output "Hello World" } function Test-Output2 { Write-Host "Hello World" -foreground Green } function Receive-Output { process { Write-Host $_ -foreground Yellow } } #Output piped to another function, not displayed in first. Test-Output | Receive-Output #Output not piped to 2nd function, only displayed in first. Test-Output2 | Receive-Output #Pipeline sends to Out-Default at the end. Test-Output

Necesitará encerrar la operación de concatenación entre paréntesis para que esa PowerShell procese la concatenación antes de tokenizar la lista de parámetros para Write-Host .

write-host ("count=" + $count)

Por cierto: mire este video de Jeffrey Snover explicando cómo funciona el oleoducto. Cuando comencé a aprender PowerShell, descubrí que esta es la explicación más útil de cómo funciona la tubería.