¿Cómo concateno dos archivos de texto en PowerShell?

108

Estoy intentando replicar la funcionalidad del cat comando en Unix.

Me gustaría evitar soluciones en las que leo explícitamente ambos archivos en variables, concateno las variables juntas y luego escribo la variable concatenada.

merlin2011
fuente

Respuestas:

170

Simplemente puede usar cat example1.txt, example2.txt | sc examples.txt. Seguramente también puede concatenar más de dos archivos con este estilo. Además, si los archivos tienen un nombre similar, puede usar:

cat example*.txt | sc allexamples.txt

El cates un alias para Get-Content, y sces un alias para Set-Content.

Nota 1 : tenga cuidado con el último método: si intenta generar una salida a examples.txt(o similar que coincida con el patrón), PowerShell entrará en un bucle infinito. (Acabo de probar esto).

Nota 2 : ¡La salida a un archivo con >no conserva la codificación de caracteres! Es por eso que se recomienda usar Set-Content( sc).

Smi
fuente
5
En caso de que alguien quiera iterar sobre archivos con Get-ChildItems | Para la construcción Foreach-Object, es posible que desee utilizar Add-Content en lugar de Set-Content. De lo contrario, el archivo de destino se sobrescribe en cada iteración.
Jonas
1
Tenga en cuenta que de forma predeterminada Set-Contentutiliza la página de códigos nacionales (por ejemplo, Windows-1252 para inglés). Si los archivos de origen contienen otra codificación (por ejemplo, Windows-1251 o UTF8), debe configurar la codificación correcta sc file.txt -Encoding UTF8(números como 1251 para ruso son compatibles desde v6.2)
Radek Pech
@Jonas El problema Add-Contentes que si ejecuta el comando dos veces, el archivo agregado es el doble de largo. Un buen reemplazo es Out-File. Ejemplo aquí
Dan Friedman
1
No parece funcionar si los archivos son binarios (por ejemplo, partes de un archivo zip en mi caso).
Daniel Lidström
1
@ DanielLidström También funciona para binarios con los parámetros correctos: Get-Content my.bin -Raw | Set-Content my.bin -NoNewlineno alterará my.binexcepto las marcas de tiempo. -Rawconserva los bytes CR / LF, mientras que -NoNewlineevita que PowerShell agregue sus propios bytes CR / LF.
Thomas
62

No lo use >; estropea la codificación de caracteres. Utilizar:

Get-Content files.* | Set-Content newfile.file
usuario2074686
fuente
cates un alias de Get-Content.
2015
5
@ n0rd Creo que fue más una cosa de "usar la tubería en su lugar".
ksoo
Puede confirmar. Estaba obteniendo ÿþcuál está FF FEal comienzo de mi archivo concatenado cuando lo uso >.
gpresland
16

En cmd, puede hacer esto:

copy one.txt+two.txt+three.txt four.txt

En PowerShell esto sería:

cmd /c copy one.txt+two.txt+three.txt four.txt

Si bien la forma de PowerShell sería usar gc , lo anterior será bastante rápido, especialmente para archivos grandes. Y también se puede utilizar en archivos que no sean ASCII mediante el /Bconmutador.

manojlds
fuente
3
Para mí, el comando cat ejecuta varios órdenes de magnitud más que el comando cmd / c (que se ejecuta muy rápido); gracias por señalar la opción!
Rob
Esta es la mejor respuesta.
Nicholas DiPiazza
12

Puede usar el cmdlet Add-Content . Tal vez sea un poco más rápido que las otras soluciones, porque no recupero el contenido del primer archivo.

gc .\file2.txt| Add-Content -Path .\file1.txt
mjsr
fuente
¿A qué se gcrefiere?
octopusgrabbus
gces un alias de Get-Content
MM.
8

Para concatizar archivos en el símbolo del sistema sería

type file1.txt file2.txt file3.txt > files.txt

PowerShell convierte el typecomando en Get-Content, lo que significa que obtendrá un error al usar el typecomando en PowerShell porque el Get-Contentcomando requiere una coma que separe los archivos. El mismo comando en PowerShell sería

Get-Content file1.txt,file2.txt,file3.txt | Set-Content files.txt
Brian Kimball
fuente
5

Si necesita ordenar los archivos por parámetro específico (por ejemplo, fecha y hora):

gci *.log | sort LastWriteTime | % {$(Get-Content $_)} | Set-Content result.log
Romano O
fuente
3

Solía:

Get-Content c:\FileToAppend_*.log | Out-File -FilePath C:\DestinationFile.log 
-Encoding ASCII -Append

Esto se agregó bien. Agregué la codificación ASCII para eliminar los caracteres nulos que mostraba Notepad ++ sin la codificación explícita.

Phoenix14830
fuente
2

Puedes hacer algo como:

get-content input_file1 > output_file
get-content input_file2 >> output_file

Donde >es un alias para "out-file", y >> es un alias para "out-file -append".

Vlad-Ardelean
fuente
2

Dado que la mayoría de las otras respuestas a menudo tienen un formato incorrecto (debido a la tubería), lo más seguro es lo siguiente:

add-content $YourMasterFile -value (get-content $SomeAdditionalFile)

Sé que querías evitar leer el contenido de $ SomeAdditionalFile en una variable, pero para guardar, por ejemplo, el formato de tu nueva línea, no creo que haya una forma adecuada de hacerlo sin él.

Una solución alternativa sería recorrer su $ SomeAdditionalFile línea por línea y conectarlo a su $ YourMasterFile. Sin embargo, esto requiere demasiados recursos.

Kamaradski
fuente
1

Para mantener la codificación y los finales de línea:

Get-Content files.* -Raw | Set-Content newfile.file -NoNewline

Nota: AFAIR, cuyos parámetros no son compatibles con los antiguos Powershells (<3? <4?)

Ilyan
fuente
0

Creo que la "forma de powershell" podría ser:

set-content destination.log -value (get-content c:\FileToAppend_*.log )
dvjz
fuente