Bagaimana cara menggabungkan dua file teks di PowerShell?

108

Saya mencoba mereplikasi fungsionalitas catperintah di Unix.

Saya ingin menghindari solusi di mana saya secara eksplisit membaca kedua file menjadi variabel, menggabungkan variabel bersama-sama, dan kemudian menulis variabel gabungan.

merlin2011
sumber

Jawaban:

170

Anda cukup menggunakan cat example1.txt, example2.txt | sc examples.txt. Anda pasti dapat menggabungkan lebih dari dua file dengan gaya ini juga. Selain itu, jika file diberi nama serupa, Anda dapat menggunakan:

cat example*.txt | sc allexamples.txt

Itu catadalah alias untuk Get-Content, dan scmerupakan alias untuk Set-Content.

Catatan 1 : Hati-hati dengan metode yang terakhir - jika Anda mencoba menampilkan ke examples.txt(atau serupa yang cocok dengan pola), PowerShell akan masuk ke loop tak terbatas! (Saya baru saja menguji ini).

Catatan 2 : Menghasilkan file dengan >tidak mempertahankan pengkodean karakter! Inilah mengapa menggunakan Set-Content( sc) direkomendasikan.

Smi
sumber
5
Untuk berjaga-jaga jika seseorang ingin mengulang file dengan Get-ChildItems | Foreach-Object membangun Anda mungkin ingin menggunakan Add-Content daripada Set-Content. Jika tidak, file target akan ditimpa di setiap iterasi.
Jonas
1
Perhatikan bahwa secara default Set-Contentmenggunakan halaman kode nasional (misalnya Windows-1252 untuk bahasa Inggris). Jika file sumber berisi pengkodean lain (misalnya Windows-1251 atau UTF8), Anda harus mengatur pengkodean yang benar sc file.txt -Encoding UTF8(nomor seperti 1251 untuk bahasa Rusia didukung sejak v6.2)
Radek Pech
@Jonas Masalahnya Add-Contentadalah jika Anda menjalankan perintah dua kali, file agregat dua kali lebih lama. Pengganti yang bagus adalah Out-File. Contoh di sini
Dan Friedman
1
Sepertinya tidak berfungsi jika file-file itu biner (misalnya, bagian dari zipfile dalam kasus saya).
Daniel Lidström
1
@ DanielLidström Ini juga bekerja untuk binari dengan parameter yang benar: Get-Content my.bin -Raw | Set-Content my.bin -NoNewlinetidak akan berubah my.binkecuali cap waktu. -Rawmempertahankan byte CR / LF, sementara -NoNewlinemencegah PowerShell menambahkan byte CR / LF-nya sendiri.
Thomas
62

Jangan gunakan >; itu mengacaukan pengkodean karakter. Menggunakan:

Get-Content files.* | Set-Content newfile.file
pengguna2074686
sumber
catadalah alias untuk Get-Content.
n0
5
@ n0rd Saya pikir itu lebih merupakan hal "gunakan pipa sebagai gantinya".
ksoo
Bisa konfirmasi. Mendapatkan ÿþyang FF FEdi awal file gabungan saya saat menggunakan >.
gpresland
16

Di cmd, Anda dapat melakukan ini:

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

Di PowerShell ini akan menjadi:

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

Sementara cara PowerShell akan menggunakan gc , cara di atas akan cukup cepat, terutama untuk file besar. Dan itu dapat digunakan pada file non- ASCII juga menggunakan /Bsakelar.

manojlds
sumber
3
Bagi saya perintah cat menjalankan beberapa kali lipat lebih panjang dari perintah cmd / c (yang berjalan sangat cepat); terima kasih telah menunjukkan opsinya!
Rob
Ini jawaban terbaik.
Nicholas DiPiazza
12

Anda dapat menggunakan cmdlet Add-Content . Mungkin ini sedikit lebih cepat daripada solusi lainnya, karena saya tidak mengambil konten file pertama.

gc .\file2.txt| Add-Content -Path .\file1.txt
mjsr
sumber
Untuk apa gcmerujuk?
octopusgrabbus
gcadalah alias untuk Get-Content
MM.
8

Untuk menggabungkan file dalam command prompt itu akan menjadi

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

PowerShell mengonversi typeperintah menjadi Get-Content, yang berarti Anda akan mendapatkan kesalahan saat menggunakan typeperintah di PowerShell karena Get-Contentperintah tersebut memerlukan koma yang memisahkan file. Perintah yang sama di PowerShell adalah

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

Jika Anda perlu memesan file dengan parameter tertentu (misalnya tanggal waktu):

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

Saya menggunakan:

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

Ini ditambahkan dengan baik. Saya menambahkan pengkodean ASCII untuk menghapus karakter nol yang ditampilkan Notepad ++ tanpa pengkodean eksplisit.

Phoenix14830
sumber
2

Anda dapat melakukan sesuatu seperti:

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

Di mana >adalah alias untuk "out-file", dan >> adalah alias untuk "out-file -append".

vlad-ardelean.dll
sumber
2

Karena sebagian besar balasan lain sering salah formatnya (karena perpipaan), hal teraman untuk dilakukan adalah sebagai berikut:

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

Saya tahu Anda ingin menghindari membaca konten $ SomeAdditionalFile ke dalam variabel, tetapi untuk menyimpan misalnya format baris baru Anda, saya rasa tidak ada cara yang tepat untuk melakukannya tanpa.

Solusinya adalah dengan mengulang baris $ SomeAdditionalFile Anda demi baris dan menyalurkannya ke $ YourMasterFile Anda. Namun ini terlalu intensif sumber daya.

Kamaradski
sumber
1

Untuk menjaga encoding dan akhir baris:

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

Catatan: AFAIR, yang parameternya tidak didukung oleh Powershells lama (<3? <4?)

Ilyan
sumber
0

Saya pikir "cara PowerShell" bisa jadi:

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