Como concateno dois arquivos de texto no PowerShell?

108

Estou tentando replicar a funcionalidade do catcomando no Unix.

Gostaria de evitar soluções em que leio explicitamente ambos os arquivos em variáveis, concateno as variáveis ​​juntas e, em seguida, escrevo a variável concatenada.

merlin2011
fonte

Respostas:

170

Você pode simplesmente usar cat example1.txt, example2.txt | sc examples.txt. Você certamente pode concatenar mais de dois arquivos com esse estilo também. Além disso, se os arquivos tiverem nomes semelhantes, você pode usar:

cat example*.txt | sc allexamples.txt

O caté um alias para Get-Contente scé um alias para Set-Content.

Nota 1 : tenha cuidado com o último método - se você tentar enviar para examples.txt(ou algo semelhante que corresponda ao padrão), o PowerShell entrará em um loop infinito! (Acabei de testar isso).

Nota 2 : A saída para um arquivo com >não preserva a codificação de caracteres! É por isso que o uso de Set-Content( sc) é recomendado.

Smi
fonte
5
Apenas no caso de alguém querer iterar em arquivos com Get-ChildItems | Você pode querer usar a construção Foreach-Object em vez de Set-Content. Caso contrário, o arquivo de destino será sobrescrito em cada iteração.
Jonas
1
Observe que, por padrão, Set-Contentusa a página de código nacional (por exemplo, Windows-1252 para inglês). Se os arquivos de origem contiverem outra codificação (por exemplo, Windows-1251 ou UTF8), você deve definir a codificação correta sc file.txt -Encoding UTF8(números como 1251 para russo são suportados desde a v6.2)
Radek Pech
@Jonas O problema Add-Contenté que se você executar o comando duas vezes, o arquivo agregado terá o dobro do tamanho. Um bom substituto é Out-File. Exemplo aqui
Dan Friedman
1
Não parece funcionar se os arquivos forem binários (por exemplo, partes de um arquivo zip no meu caso).
Daniel Lidström
1
@ DanielLidström Também funciona para binários com os parâmetros corretos: Get-Content my.bin -Raw | Set-Content my.bin -NoNewlinenão será alterado, my.binexceto os carimbos de data / hora. -Rawpreserva quaisquer bytes CR / LF, enquanto -NoNewlineevita que o PowerShell adicione seus próprios bytes CR / LF.
Thomas
62

Não use >; bagunça a codificação de caracteres. Usar:

Get-Content files.* | Set-Content newfile.file
user2074686
fonte
caté um alias para Get-Content.
n0 de
5
@ n0rd Acho que foi mais uma coisa do tipo "use o pipeline".
ksoo
Pode confirmar. Estava pegando ÿþque está FF FEno início do meu arquivo concatenado ao usar >.
gpresland
16

Em cmd, você pode fazer isso:

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

No PowerShell, isso seria:

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

Embora a maneira do PowerShell seja usar o gc , o procedimento acima será muito rápido, especialmente para arquivos grandes. E também pode ser usado em arquivos não ASCII usando o /Bswitch.

manojlds
fonte
3
Para mim, o comando cat executa várias ordens de magnitude mais do que o comando cmd / c (que é executado muito rápido); obrigado por apontar a opção!
Rob
Esta é a melhor resposta.
Nicholas DiPiazza
12

Você pode usar o cmdlet Add-Content . Talvez seja um pouco mais rápido do que as outras soluções, pois não recupero o conteúdo do primeiro arquivo.

gc .\file2.txt| Add-Content -Path .\file1.txt
mjsr
fonte
A que se gcrefere?
octopusgrabbus
gcé um alias para Get-Content
MM.
8

Para concat arquivos no prompt de comando, seria

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

O PowerShell converte o typecomando em Get-Content, o que significa que você obterá um erro ao usar o typecomando no PowerShell porque o Get-Contentcomando requer uma vírgula separando os arquivos. O mesmo comando no PowerShell seria

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

Se você precisar ordenar os arquivos por parâmetro específico (por exemplo, data e hora):

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

Eu usei:

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

Esta multa anexada. Eu adicionei a codificação ASCII para remover os caracteres nulos que o Notepad ++ estava mostrando sem a codificação explícita.

Phoenix14830
fonte
2

Você pode fazer algo como:

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

Onde >é um alias para "out-file" e >> é um alias para "out-file -append".

vlad-ardelean
fonte
2

Visto que a maioria das outras respostas costuma ter a formatação errada (devido ao encanamento), a coisa mais segura a fazer é a seguinte:

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

Eu sei que você queria evitar a leitura do conteúdo de $ SomeAdditionalFile em uma variável, mas para salvar, por exemplo, sua formatação de nova linha, não acho que haja uma maneira adequada de fazer isso sem.

Uma solução alternativa seria fazer um loop em seu $ SomeAdditionalFile linha por linha e canalizá-lo para seu $ YourMasterFile. No entanto, isso exige muitos recursos.

Kamaradski
fonte
1

Para manter a codificação e as terminações de linha:

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

Observação: AFAIR, cujos parâmetros não são compatíveis com Powershells antigos (<3? <4?)

Ilyan
fonte
0

Eu acho que a "maneira PowerShell" poderia ser:

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