2012-03-02 14 views
13

Prueba este pequeño experimento. Crear un archivo Foo.txt con una larga línea de texto (digamos 500 caracteres de largo) así:PowerShell: ¿Por qué Out-File rompe la línea larga en líneas más pequeñas?

// Foo.txt 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... 

Ahora ejecute el siguiente comando:

$ Get-Content Foo.txt | Select-String "a" | Out-File Foo2.txt 

se encuentra que la larga fila de cadena tiene se ha dividido en líneas más pequeñas en Foo2.txt. La longitud de cada línea más pequeña es la misma que el ancho de la consola.

¿Por qué archivo de salida rompe la línea larga en una línea más pequeña cuando la salida no se dirige a la consola?

¿Y por qué Out-File no descompone las líneas para el siguiente comando?

$ Get-Content Foo.txt | Out-File Foo3.txt 
+2

hace esta ayuda: http://stackoverflow.com/questions/2675552/avoid-line-breaks-when-using-out-file? Creo que hay una discusión sobre este tema general (la salida se formatea para cierto ancho de monitor) en "Effective Powershell" de Keith Hill, descarga gratuita. De todos modos, no sé por qué, espero que ese enlace ayude. –

Respuesta

3

Esto se puede explicar por el hecho de que el resultado de Get-Content Foo.txt | Select-String "a" es de tipo MatchInfo, que no es un string.

solo ensayo:

Get-Content Foo.txt | Select-String "a" | Format-list * 
+0

JPBlanc: Gracias, eso ayudó. ¿Alguna idea de por qué Out-File formatea MatchInfo como si se dirigiera a una consola, pero no para String? –

+1

@Ashwin El comportamiento se ve coherente para objetos complejos, p. Ej. 'MatchInfo' o' DirectoryInfo' etc ... Por ejemplo, intente esto: 'Get-Item C: \ Windows | Out-File C: \ Test.txt'. Creo que PowerShell necesita enviar objetos complejos al motor de formateo de objetos primero antes de escribir la representación textual en el archivo. –

+0

Andy Arismendi: Esa explicación tiene mucho sentido. ¡Gracias! –

8

Se puede ajustar cuando estalla-File líneas usando el parámetro -width

$ Get-Content Foo.txt | Select-String "a" | Out-File -width 1000 Foo2.txt 
8
$ Get-Content Foo.txt | Select-String "a" | Add-Content Foo2.txt 

Uso Add-Content (o se puede utilizar Set-Content si desea sobrescribir el archivo).

Cuestiones relacionadas