2010-01-10 19 views
146

Estoy ejecutando un script de PowerShell desde dentro de un archivo por lotes. El script recupera una página web y verifica si el contenido de la página es la cadena "OK".Cómo generar algo en PowerShell

El script de PowerShell devuelve un nivel de error al script por lotes.

La secuencia de comandos por lotes se ejecuta por ScriptFTP, un programa de automatización de FTP. Si ocurre un error, puedo hacer que ScriptFTP envíe la salida de la consola completa al administrador por correo electrónico.

En el script de PowerShell, me gustaría generar el valor de retorno desde el sitio web si no está "OK", por lo que el mensaje de error se incluye en la salida de la consola y, por lo tanto, en el correo de estado.

Soy nuevo en PowerShell y no estoy seguro de qué función de salida usar para esto. Veo tres:

  • Write-Host
  • Write-Output
  • Write-Error

Lo que sería lo que hay que utilizar para escribir en el equivalente de Windows de stdout?

Respuesta

152

Simplemente dando salida a algo es que PowerShell es una cosa de belleza, y una de sus mayores virtudes. Por ejemplo, el común ¡Hola, mundo!aplicación se reduce a una sola línea:

"Hello, World!" 

Se crea un objeto de cadena, asigna el valor antes mencionado, y siendo el último elemento de la canalización de comandos que llama al método .toString() y envía el resultado a STDOUT (por defecto) . Una cosa de belleza.

Los otros comandos Write-* son específicos de la salida del texto a sus secuencias asociadas, y tienen su lugar como tal.

+4

Eso no es realmente lo que sucede. Es una expresión literal de cadena y la única cosa en su línea. Por lo tanto, es equivalente a '" ¡Hola, mundo! " | Out-Host'. 'Out-Host' por otro lado envía objetos al host de PowerShell para su visualización y su implementación depende del host. El host de la consola los envía al controlador de salida estándar (pasando a través de 'Out-Default' en el camino), de hecho. PowerShell ISE los muestra en su panel de salida, sin embargo, y otros hosts pueden hacer otras cosas completamente. – Joey

+3

Los objetos tampoco se convierten a cadena ciegamente, sino que pasan a través de un _formatter_ que decide qué hacer con ellos. Es por eso que ve el resultado 'Get-ChildItem' en una tabla, por ejemplo, y los resultados con muchas propiedades (por ejemplo, WMI) por defecto a' Format-List' en su lugar. – Joey

6

Puede usar cualquiera de estos en su escenario ya que escriben en las secuencias predeterminadas (salida y error). Si estaba canalizando la salida a otro comando, querría usar Write-Output, que eventualmente terminará en Write-Host.

Este artículo describe las diferentes opciones de salida: PowerShell O is for Output

+1

Gracias por el enlace. Dios, esto es * complicado *. Si Write-host es algún tipo de punto final o función de purga, intentaré ir con eso e informaré. –

91

creo que en este caso, tendrá que Write-Output.

Si usted tiene un guión como

Write-Output "test1"; 
Write-Host "test2"; 
"test3"; 

entonces, si se llama a la secuencia de comandos con salida redirigida, algo así como yourscript.ps1 > out.txt, obtendrá test2 en la pantalla test1\ntest3\n en el "out.txt".

Tenga en cuenta que "test3" y la línea Write-Output siempre agregarán una nueva línea a su texto y PowerShell no tiene forma de detener esto (es decir, echo -n es imposible en PowerShell con los comandos nativos). Si lo desea (la funcionalidad básica y fácil en Bash) de echo -n, consulte samthebest's answer.

Si un archivo por lotes ejecuta un comando de PowerShell, lo más probable es que capture el comando Write-Output. He tenido "largas discusiones" con los administradores del sistema sobre lo que debería escribirse en la consola y lo que no debería. Ahora hemos acordado que la única información si el guión se ejecutó correctamente o murió debe ser Write-Host 'ed, y todo lo que el autor del guión podría necesitar saber sobre la ejecución (qué elementos se actualizaron, qué campos se establecieron, etcétera) va a Write-Output. De esta manera, cuando envía una secuencia de comandos al administrador del sistema, puede fácilmente runthescript.ps1 >someredirectedoutput.txt y ver en la pantalla, si todo está bien. A continuación, envíe el "someredirectedoutput.txt" a los desarrolladores.

1

Simplemente no puede hacer que PowerShell omita esas molestas líneas nuevas. No hay script o cmdlet que haga esto.

Por supuesto, Write-Host es una absoluta tontería porque no se puede redirigir/canalizar desde allí. Simplemente tiene que escribir el suyo:

using System; 

namespace WriteToStdout 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if (args != null) 
      { 
       Console.Write(string.Join(" ", args)); 
      } 
     } 
    } 
} 

P. ej.

PS C:\> writetostdout finally I can write to stdout like echo -n 
finally I can write to stdout like echo -nPS C:\> 
+0

Puedes hacer esto en PowerShell. [System.Console] :: Write ("stringy") Sin embargo, no podrá redireccionarlo en powershell. – Nicholi

+0

Claro que puedes. Ver [esta pregunta] (http://stackoverflow.com/questions/3896258/how-to-output-text-without-newline-in-powershell) –

-10

utilizar un programa externo como en el del interior de su script de PowerShell:

cmd /c echo "Long string: $LongStr" 

Esto es estúpido y caro en cuanto a la ejecución de un proceso separado, pero PowerShell está mal diseñado.

+11

Es evidente que no tienes idea de lo que estás hablando. Basta de charla. – jebar8

+0

Sé que no debería, pero lol –

2
Write-Host "Found file - " + $File.FullName -ForegroundColor Magenta 

magenta puede ser uno de los valores de enumerador "System.ConsoleColor" - Negro, DarkBlue, verde oscuro, Darkcyan, DarkRed, DarkMagenta, DarkYellow, gris, gris oscuro, azul, verde, cian, rojo, magenta, Amarillo blanco.

El + $File.FullName es opcional y muestra cómo poner una variable en la cadena.

5

Creo que la siguiente es una buena exhibición de Echo vs. Write-Host. Observe cómo test() en realidad devuelve una matriz de entradas, no una sola int, como se podría hacer creer fácilmente.

function test { 
    Write-Host 123 
    echo 456 # AKA 'Write-Output' 
    return 789 
} 

$x = test 

Write-Host "x of type '$($x.GetType().name)' = $x" 

Write-Host "`$x[0] = $($x[0])" 
Write-Host "`$x[1] = $($x[1])" 

salida de la terminal de las anteriores:

123 
x of type 'Object[]' = 456 789 
$x[0] = 456 
$x[1] = 789 
Cuestiones relacionadas