Quiero que mi script de PowerShell imprima algo como esto:
Enabling feature XYZ......Done
El guión se parece a esto:
Write-Output "Enabling feature XYZ......."
Enable-SPFeature...
Write-Output "Done"
Pero Write-Output
siempre imprime una nueva línea al final para que mi salida no esté en una línea. ¿Hay alguna forma de hacer esto?
powershell
Amit G
fuente
fuente
Respuestas:
fuente
Write-Output
, que tiene una función muy diferente a la deWrite-Host
. Los lectores deben tener en cuenta esta gran discrepancia antes de copiar / pegar la respuesta.Write-Host
Casi nunca es la respuesta correcta. Es el equivalente a hacerlo>/dev/tty
en Unixland.Write-Progress
puede ser apropiado en algunos casos, vea el ejemplo a continuación.Write-Output
.Write-Output
no tiene el-NoNewLine
parámetroDesafortunadamente, como se señaló en varias respuestas y comentarios,
Write-Host
puede ser peligroso y no puede canalizarse a otros procesos yWrite-Output
no tiene el-NoNewline
bandera.Pero esos métodos son las formas "* nix" de mostrar la progresión, la forma "PowerShell" de hacerlo parece ser
Write-Progress
: muestra una barra en la parte superior de la ventana de PowerShell con información de progreso, disponible desde PowerShell 3.0 en adelante, consulte el manual para detalles.Y para tomar el ejemplo del OP:
fuente
Si bien es posible que no funcione en su caso (ya que está proporcionando resultados informativos al usuario), cree una cadena que pueda usar para agregar resultados. Cuando llegue el momento de enviarlo, simplemente envíe la cadena.
Ignorando, por supuesto, que este ejemplo es tonto en su caso pero útil en concepto:
Muestra:
fuente
Write-Output
. Solución razonable, pero no una solución.Sí, como otras respuestas tienen estados, no se puede hacer con Write-Output. Cuando PowerShell falla, recurra a .NET, incluso hay un par de respuestas .NET aquí, pero son más complejas de lo necesario.
Solo usa:
No es el PowerShell más puro, pero funciona.
fuente
Write-Host
, excepto que la gente no lo esperará.Para escribir en un archivo, puede usar una matriz de bytes. El siguiente ejemplo crea un archivo ZIP vacío, al que puede agregar archivos:
O usar:
fuente
Una simplificación a la respuesta de FrinkTheBrave:
fuente
El problema que encontré fue que Write-Output en realidad interrumpe la salida cuando se usa PowerShell v2, al menos para stdout. Estaba tratando de escribir un texto XML para stdout sin éxito, porque sería difícil en el carácter 80.
La solución era usar
Esto no fue un problema en PowerShell v3. Write-Output parece estar funcionando correctamente allí.
Dependiendo de cómo se invoque el script de PowerShell, es posible que deba usar
antes de escribir a stdout.
fuente
Parece que no hay forma de hacer esto en PowerShell. Todas las respuestas anteriores no son correctas, porque no se comportan de la manera en que se
Write-Output
comportan, sino más bienWrite-Host
no tienen este problema de todos modos.La solución de cierre parece usarse
Write-Host
con el-NoNewLine
parámetro. No puede canalizar esto, lo cual es un problema en general, pero hay una manera de anular esta función como se describe en Write-Host => Exportar a un archivo , por lo que puede hacer que acepte fácilmente el parámetro para un archivo de salida. Esto aún está lejos de ser una buena solución. ConStart-Transcript
esto es más útil, pero ese cmdlet tiene problemas con las aplicaciones nativas.Write-Output
simplemente no puede hacer lo que necesita en un contexto general.fuente
Write-Host
es terrible, un destructor de mundos, sin embargo, puede usarlo solo para mostrar el progreso a un usuario mientras lo usaWrite-Output
para iniciar sesión (no es que el OP solicite el registro).fuente
Write-Progress
.Simplemente no puede hacer que PowerShell omita esas molestas líneas nuevas ... No hay ningún script o cmdlet que lo haga. Por supuesto, Write-Host es una tontería absoluta, ¡porque no puedes redirigirlo / canalizarlo!
Sin embargo, puede escribir su propio archivo EXE para hacerlo, que es lo que le expliqué cómo hacer en la pregunta de desbordamiento de pila Cómo generar algo en PowerShell .
fuente
La respuesta de shufler es correcta. Dicho de otra manera: en lugar de pasar los valores a Write-Output utilizando el FORMATO ARRAY,
o el equivalente por múltiples llamadas a Write-Output,
primero concatene sus componentes en una VARIABLE DE CADENA:
Esto evitará los CRLF intermedios causados por llamar a Write-Output varias veces (o ARRAY FORM), pero, por supuesto, no suprimirá el CRLF final del comando de escritura de salida. Para eso, tendrá que escribir su propio comando, usar una de las otras soluciones enrevesadas enumeradas aquí o esperar hasta que Microsoft decida admitir el
-NoNewline
opción de Escritura-Salida.Su deseo de proporcionar un medidor de progreso textual a la consola (es decir, "...") en lugar de escribir en un archivo de registro, también debe satisfacerse utilizando Write-Host. Puede lograr ambas cosas al recopilar el texto del mensaje en una variable para escribir en el registro Y usar Write-Host para proporcionar progreso a la consola. Esta funcionalidad se puede combinar en su propio comando para una mejor reutilización del código.
fuente
Write-Output
, simplemente no puede verlo porque es lo último escrito. Solución razonable, pero no una solución. Puede haber algo que consume la salida resultante que no puede manejar la nueva línea final.Lo siguiente colocará el cursor hacia atrás al comienzo de la fila anterior. Depende de usted colocarlo en la posición horizontal correcta (usando $ pos.X para moverlo hacia los lados):
Su salida actual es de 27 espacios, por lo que $ pos.X = 27 podría funcionar.
fuente
$pos.X
también lo hace. El problema es que si lo canaliza a un archivo, aparecen dos líneas separadas.Puede que no sea terriblemente elegante, pero hace exactamente lo que OP solicitó. Tenga en cuenta que el ISE se mete con StdOut, por lo que no habrá salida. Para que este script funcione, no se puede ejecutar dentro del ISE.
fuente
[System.Console]
no se puede redirigir a un archivo.Hice trampa, pero creo que esta es la única respuesta que aborda todos los requisitos. Es decir, esto evita el CRLF final, proporciona un lugar para que se complete la otra operación mientras tanto, y redirige adecuadamente a stdout según sea necesario.
fuente
fuente
o / p deseado: Habilitando la función XYZ ...... Listo
puedes usar el siguiente comando
$ a = "Habilitando la función XYZ"
Salida de escritura "$ a ...... Listo"
tienes que agregar variables y sentencias entre comillas. Espero que esto sea útil :)
Gracias Techiegal
fuente
Ya hay tanta respuesta aquí, nadie se desplazará hacia abajo aquí. De todos modos, también hay una solución para escribir texto sin una nueva línea al final, con lo siguiente:
Salida de archivo con codificación:
Salida de consola:
fuente
Absolutamente puedes hacer esto. Write-Output tiene un indicador llamado " NoEnumerate " que es esencialmente lo mismo.
fuente