Estoy ejecutando un script de PowerShell desde un archivo por lotes. El script busca una página web y comprueba 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 FTP. Si se produce 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 del sitio web si no está "OK", por lo que el mensaje de error se incluye en el resultado 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:
- Host de escritura
- Salida de escritura
- Error de escritura
¿Cuál sería el uso correcto para escribir en el equivalente de Windows stdout
?
fuente
"Hello, World!" | 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 porOut-Default
el camino), de hecho. PowerShell ISE los muestra en su panel de salida, sin embargo, y otros hosts pueden hacer otras cosas por completo.Get-ChildItem
la salida de la tabla en forma de tabla, por ejemplo, y resultados con muchas propiedades (por ejemplo, WMI) predeterminadas en suFormat-List
lugar.Creo que en este caso necesitarás Write-Output .
Si tienes un script como
luego, si llama al script con salida redirigida, algo así
yourscript.ps1 > out.txt
, aparecerátest2
en la pantallatest1\ntest3\n
en "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 PowerShell de detener esto (es decir,
echo -n
es imposible en PowerShell con los comandos nativos). Si desea la funcionalidad (algo básica y fácil en Bash ) deecho -n
, consulte 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 se debe escribir en la consola y lo que no. Ahora hemos acordado que la única información si el script se ejecutó con éxito o murió tiene que ser
Write-Host
editado, y todo lo que es el autor del script podría necesitar saber sobre la ejecución (qué elementos se actualizaron, qué campos se configuraron, etc.) a Escribir-Salida. De esta manera, cuando envía un script al administrador del sistema, él puederunthescript.ps1 >someredirectedoutput.txt
ver fácilmente en la pantalla, si todo está bien. Luego envíe el "someredirectedoutput.txt" a los desarrolladores.fuente
Creo que lo siguiente es una buena exhibición de Echo vs. Write-Host . Observe cómo test () en realidad devuelve una matriz de entradas, no una única int como se podría hacer creer fácilmente.
Salida terminal de lo anterior:
fuente
$x = test
solo se imprime123
y no también456
?Puede usar cualquiera de estos en su escenario ya que escriben en las transmisiones predeterminadas (salida y error). Si estaba canalizando la salida a otro comando, desearía usar Write-Output , que finalmente terminará en Write-Host .
Este artículo describe las diferentes opciones de salida: PowerShell O es para Salida
fuente
Magenta puede ser uno de los valores del enumerador "System.ConsoleColor": negro, azul oscuro, verde oscuro, azul 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 colocar una variable en la cadena.fuente
Simplemente no puede hacer que PowerShell omita esas molestas líneas nuevas. No hay script o cmdlet que haga esto.
¡Por supuesto, Write-Host no tiene sentido porque no puedes redirigirlo / canalizarlo! Simplemente tienes que escribir el tuyo:
P.ej
fuente
En efecto , pero desafortunadamente , tanto Windows PowerShell como PowerShell Core a partir de v7.0 envían todas sus 6 (!) Secuencias de salida a stdout cuando se les llama desde el exterior , a través de PowerShell CLI .
Ver este problema de GitHub para una discusión de este comportamiento problemático, que probablemente no se solucionará por razones de compatibilidad con versiones anteriores.
En la práctica, esto significa que cualquier llamada de PowerShell a la que envíe la salida será vista como salida estándar por un llamador externo:
Por ejemplo, si ejecuta la siguiente desde
cmd.exe
, verá ninguna salida, porque la redirección de la salida estándar aNUL
se aplica por igual a todas las corrientes de PowerShell:C:\>powershell -noprofile -command "Write-Error error!" >NUL
Sin embargo - curiosamente - si redirigir stderr , PowerShell hace enviar su flujo de error en stderr , de manera que con
2>
usted puede capturar la salida de error de la corriente de forma selectiva; las siguientes salidas solo'hi'
- la salida de flujo de éxito - mientras captura la salida de flujo de error en el archivoerr.txt
:C:\>powershell -noprofile -command "'hi'; Write-Error error!" 2>err.txt
El comportamiento deseable es:
1
de PowerShell (número ) a stdout .Envíe la salida de todas las demás secuencias a stderr , que es la única opción, dado que entre los procesos solo existen 2 secuencias de salida: stdout (salida estándar) para datos y stderr (error estándar) para mensajes de error y todos los demás tipos de mensajes, como como información de estado, que no son datos .
Es aconsejable hacer esta distinción en su código, a pesar de que actualmente no se está respetando .
Dentro de PowerShell :
Write-Host
es para mostrar la salida y omite el flujo de salida de éxito ; como tal, su salida no puede capturarse (directamente) en una variable ni suprimirse ni redirigirse.Su intención original era simplemente crear comentarios de los usuarios y crear interfaces de usuario simples, basadas en la consola (salida en color).
Debido a la incapacidad previa para ser capturado o redirigido, PowerShell versión 5 se realizó
Write-Host
en el flujo de información recientemente introducido (número6
), por lo que desde entonces es posible capturar y redirigir laWrite-Host
salida.Write-Error
está destinado a escribir errores sin terminación en la secuencia de errores (número2
); conceptualmente, el flujo de error es el equivalente de stderr.Write-Output
escribe en la secuencia de éxito [salida] (número1
), que es conceptualmente equivalente a stdout; es el flujo para escribir datos (resultados).Write-Output
debido a la función de salida implícita de PowerShell :Write-Output "Honey, I'm $HOME"
y"Honey, I'm $HOME"
son equivalentes, siendo este último no solo más conciso, sino también más rápido.fuente