windows - run - Cómo generar algo en PowerShell
run powershell script (7)
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".
El script de PowerShell devuelve un nivel de error al script por lotes.
El Script por lotes es ejecutado 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. Puedo ver tres:
- Escribir-Anfitrión
- Write-Output
- Error de escritura
¿Qué sería lo correcto para escribir en el equivalente de Windows de stdout
?
Creo que en este caso necesitarás Write-Output .
Si tienes un script como
Write-Output "test1";
Write-Host "test2";
"test3";
luego, si llama al script 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 no hay forma en que PowerShell lo detenga (es decir, echo -n
es imposible en PowerShell con los comandos nativos). Si quieres (la funcionalidad básica y fácil en Bash ) del echo -n
entonces ve la respuesta de samthebest .
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ó satisfactoriamente 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, et cetera) 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.
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 terminal de lo anterior:
123
x of type ''Object[]'' = 456 789
$x[0] = 456
$x[1] = 789
Puede usar cualquiera de estos en su escenario ya que escriben en las secuencias predeterminadas (salida y error). Si estuvieras canalizando la salida a otro comando, querrías usar Write-Output , que eventualmente terminará en Write-Host .
Este artículo describe las diferentes opciones de salida: PowerShell O es para Salida
Simplemente dando salida a algo es que PowerShell es algo hermoso, y uno de sus mayores puntos fuertes. Por ejemplo, el común ¡Hola, mundo! la aplicación se reduce a una sola línea:
"Hello, World!"
Crea un objeto de cadena, asigna el valor antes mencionado y, al ser el último elemento en la línea de comando, llama al método .toString()
y envía el resultado a STDOUT
(de forma predeterminada). Una cosa de belleza.
Los otros comandos Write-*
son específicos para dar salida al texto a sus flujos asociados, y tienen su lugar como tal.
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 puedes 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:/>
Use un programa externo como desde dentro de su script de PowerShell:
cmd /c echo "Long string: $LongStr"
Esto es estúpido y costoso en términos de ejecutar un proceso separado, pero PowerShell está mal diseñado.
Write-Host "Found file - " + $File.FullName -ForegroundColor Magenta
Magenta puede ser uno de los valores del enumerador "System.ConsoleColor": negro, azul oscuro, verde oscuro, ciánico oscuro, rojo oscuro, magenta oscuro, amarillo oscuro, 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.