2011-05-27 14 views
13

Quiero recopilar todos los resultados de mi secuencia de comandos en un archivo de registro y debo usar write-output en instaed of write-host.Evitar la nueva línea en la salida de escritura

Write-Output "Server:" $a parece

Server:
foo
.

¿Realmente tengo que escribir para escribir
write-output $("sfdghk:" + $a) para obtener Server:Foo

Gracias -jt

+8

'Write-Output "servidor: $ a"' –

+1

@empo: Debe presentar esto como una respuesta. En mi opinión, es más directo y relevante que la única respuesta hasta ahora. –

Respuesta

6

9 horas ... comienzo a una respuesta.

En Powershell todo lo que manipulas es un objeto.

modo "Servidor:" es un objeto, $ a es un objeto

PS> "server :".gettype() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  String         System.Object 

Write-output es un cmdlet que puso objeto en una especie de lista (un tubo) para ser utilizado por otros cmdlets o scripts. Entonces, realmente no hay una nueva línea entre "Servidor:" y "foo". Es la forma en que la consola te muestra una lista (una matriz) de objetos. Como se puede ver aquí debajo:

PS> $a = "foo" 
PS> (Write-Output "Server :" $a).gettype() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  Object[]         System.Array 

Es evidente que es un resumen aquí, pero espero que pueda hacerte entender.

15

encontrado algún lugar de Internet:

Write-Output "Server: $($a)" 

funciona muy bien en mi código.

+4

Para este ejemplo, el constructo '$ (...)' es redundante, ya que dice tratar todo dentro de los paréntesis como script en lugar de texto. Como '$ a' ya se interpreta e inserta en cadenas entrecomilladas, no es necesario agregar el contenedor. Servidor 'Write-Output ': $ a" ' ... funcionará bien. Use el contenedor '$()' cuando intente acceder a métodos o propiedades de variables. '$ a =" Me gustan los huevos ". Write-Output "Número de caracteres: $ ($ a.length)" 'imprimirá' I eggs eggs..length' sin el contenedor '$ (...)'. – HipCzeck

+0

gracias, ¡me salvas al día! Creo que esto es un problema de diseño de Powershell, no debería ser tan diferente a otro script lang. – ariso

4
Write-Output "Server: $a" 
Write-Output ("Server: {0}" -f $a) 
Write-Output ("Server: " + $a) 

Si se quiere recoger la salida de una secuencia de comandos en un archivo de registro, considere el uso Start-Transcript. Registra cada comando y toda la salida de PowerShell en un archivo. No registra cualquier cosa enviada a la salida estándar, sin embargo, por lo que si usted está utilizando los comandos de legado, usted tiene que canalizar su producción a Write-Host:

Start-Transcript C:\logs\mylog.txt 
Write-Host "Server: " $a 
ping | Write-Host 
+1

El _equivalente_ de PowerShell a stdout es su _cadena de salida_success_ y las cosas enviadas allí _do_ get logged. 'Write-Host' _en el pasado_ no escribió en _stdout_ sino que se imprimió _directly en la consola_, por lo que dicho resultado no apareció en las transcripciones. En PSv5 +, sin embargo, 'Write-Host' /' Out-Host' ahora escribe en la nueva _information stream_ introducida (como lo hace el nuevo cmdlet 'Write-Information'), que ahora _does_ get logged. Puede usar '$ null = ...' para suprimir la salida por completo, o, para emular el comportamiento PSv4- 'Write-Host' en este contexto, use' $ host.ui.WriteLine() '. – mklement0

0

Hay buena información en las respuestas existentes, pero vamos me intento un resumen pragmática:

  • Cuando se imprime en la consola o volver a dirigir a un archivo, Write-Output separa varios argumentos por una nueva línea cada.

  • Por lo tanto, con el fin de producir sola línea de salida, debe "pre-ensamblar" las partes a la salida en una sola cadena que se pasa como un solo argumento .

  • Excepto para suprimir la enumeración de colecciones, por lo general, no es necesario utilizar Write-Output explícitamente, porque PowerShell por defecto envía todo lo que no se captura en una variable o redirigido a otra parte o se envía a través de la tubería para la corriente de salida [success] (que también escribe Write-Output); Así, en el caso que nos ocupa, la siguiente es suficiente:

"Server: $a" # what this expandable string expands to is *implicitly* output 

Lo que puede ser confuso es que la Write-Host cmdlet actúa de forma diferente, pero es importante tener en cuenta que tiene un propósito diferente.

# IMPORTANT: Do not use Write-Host to output *data*; only use it to write 
#   directly to the host (console). 
> Write-Host "Server:"  $a # multiple spaces used on purpose 
Server: srv1 

Write-Host, a diferencia de Write-Output, separa varios argumentos por un solo espacio cada uno.
Existen otras diferencias importantes, que se resumen en this answer de la mía.


Dado el título genérico de la cuestión, también vamos a abordar cómo suprimir un detrás nueva línea:

  • Para imprimir a la consola sólo, puede utilizar Write-Host -NoNewline.

  • Con datos salida, ya sea a través de Write-Output, salida implícita o de otro comando:

    • Usted no puede evitar un salto de línea final cuando la salida se envía a la consola .

    • Desafortunadamente, a partir de Windows PowerShell v5.1/PowerShell Core v6.0.0, que puede no evitar que un salto de línea final al enviar texto a programas externos a través de la tubería - ver this GitHub issue.

    • En PSV5 +, sin embargo, que puede evitar que un salto de línea final cuando captura de salida en un archivo , mediante el uso de Out-File -NoNewline o Set-Content -NoNewline (en PSv4-, debe utilizar el .NET Framework directamente) ; por el contrario, al redirigir a un archivo con > se agrega una nueva línea final.

      • Advertencia: si la salida múltiples objetos, -NoNewline no sólo suprime una detrás nueva línea, sino también nuevas líneas entre estos objetos.
      • Para las diferencias entre Out-File y Set-Content y cuándo elegir cuál, vea this answer de la mía.
Cuestiones relacionadas