PowerShell'de iki metin dosyasını nasıl birleştiririm?


108

catUnix'te komutun işlevselliğini kopyalamaya çalışıyorum .

Her iki dosyayı da değişkenler halinde açıkça okuduğum, değişkenleri birleştirdiğim ve ardından birleştirilmiş değişkeni yazdığım çözümlerden kaçınmak istiyorum.

Yanıtlar:


170

Basitçe kullanabilirsiniz cat example1.txt, example2.txt | sc examples.txt. Bu stille ikiden fazla dosyayı da kesinlikle birleştirebilirsiniz. Ayrıca, dosyalar benzer şekilde adlandırılırsa şunları kullanabilirsiniz:

cat example*.txt | sc allexamples.txt

catİçin bir takma ad Get-Contentve scbir diğer adıdır Set-Content.

Not 1 : İkinci yönteme dikkat edin - çıktı almaya çalışırsanız examples.txt(veya desene uyan benzer), PowerShell sonsuz bir döngüye girecektir! (Bunu daha yeni test ettim).

Not 2 : Bir dosyaya çıktı almak >karakter kodlamasını korumaz! Bu nedenle Set-Content( sc) kullanılması önerilir.


5
Birinin Get-ChildItems | ile dosyaları yinelemek istemesi durumunda. Foreach-Object yapısı Set-Content yerine Add-Content kullanmak isteyebilirsiniz. Aksi takdirde, her yinelemede hedef dosyanın üzerine yazılır.
— Jonas 18

1
Varsayılan olarak Set-Contentulusal kod sayfasını kullandığına dikkat edin (örn. İngilizce için Windows-1252). Kaynak dosyalar başka kodlamalar içeriyorsa (ör. Windows-1251 veya UTF8), doğru kodlamayı ayarlamanız gerekir sc file.txt -Encoding UTF8(Rusça için 1251 gibi sayılar v6.2'den beri desteklenmektedir)
— Radek Pech

@Jonas Bununla ilgili sorun Add-Content, komutu iki kez çalıştırırsanız, toplanan dosyanın iki kat daha uzun olmasıdır. İyi bir yedek Out-File. Buradaki
— Dan Friedman

1
Dosyalar ikili ise çalışmıyor gibi görünüyor (örneğin, benim durumumda bir zip dosyasının parçaları).
— Daniel Lidström

1
DanielLidström @ Ayrıca doğru parametrelerle olan çiftler için çalışır: Get-Content my.bin -Raw | Set-Content my.bin -NoNewlinedeğiştirmez my.bindamgaları dışında. -Rawherhangi bir CR / LF baytını korurken -NoNewlinePowerShell'in kendi CR / LF baytlarını eklemesini engeller.
— Thomas

62

Kullanmayın >; karakter kodlamasını bozar. Kullanım:

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

catiçin bir takma addır Get-Content.
— n0rd

5
@ n0rd Bence daha çok bir "boru hattını kullan" şeyiydi.
— ksoo

Onaylayabilir. Kullanırken birleştirilen dosyamın başında ÿþolan alıyordum . FF FE>
— gpresland

16

İçinde cmdbunu yapabilirsiniz:

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

PowerShell'de bu şöyle olacaktır:

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

PowerShell yöntemi gc kullanmak olsa da , yukarıdakiler özellikle büyük dosyalar için oldukça hızlı olacaktır. ASCII olmayan dosyalarda da /Banahtar kullanılarak kullanılabilir .


3
Benim için cat komutu, cmd / c komutundan (gerçekten hızlı çalışan) daha uzun birden çok büyüklük sırasını çalıştırır; seçeneği işaret ettiğiniz için teşekkürler!
— Rob

Bu en iyi cevap.
— Nicholas DiPiazza

12

Sen kullanabilirsiniz Eklenti İçerik cmdlet'ini. Belki diğer çözümlerden biraz daha hızlıdır çünkü ilk dosyanın içeriğini alamıyorum.

gc .\file2.txt| Add-Content -Path .\file1.txt

Neye gcatıfta bulunuyor?
— octopusgrabbus

gcGet-Content
— MM

8

Dosyaları komut isteminde birleştirmek için

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

PowerShell, typekomutu olarak dönüştürür; Get-Contentbu type, PowerShell'de komutu kullanırken bir hata alacağınız anlamına gelir çünkü Get-Contentkomut, dosyaları ayırmak için virgül gerektirir. PowerShell'deki aynı komut şöyle olacaktır:

Get-Content file1.txt,file2.txt,file3.txt | Set-Content files.txt

5

Dosyaları belirli bir parametreye göre sipariş etmeniz gerekiyorsa (ör. Tarih saati):

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

3

Kullandım:

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

Bu iyi eklendi. Açık kodlama olmadan Notepad ++ 'nın gösterdiği nul karakterleri kaldırmak için ASCII kodlamasını ekledim.


2

Şunun gibi bir şey yapabilirsiniz:

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

Nerede >"out-file" için bir takma ad olduğunu ve >> "out-file -append" için bir diğer adıdır.


2

Diğer yanıtların çoğu genellikle biçimlendirmeyi yanlış anladığından (kanallar nedeniyle), yapılacak en güvenli şey şu şekildedir:

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

$ SomeAdditionalFile içeriğini bir değişkene okumaktan kaçınmak istediğinizi biliyorum, ancak örneğin yeni satır biçimlendirmenizi kaydetmek için, bunu olmadan yapmanın uygun bir yolu olduğunu düşünmüyorum.

Bir çözüm, $ SomeAdditionalFile satırınızı satır satır döngüye sokmak ve bunu $ YourMasterFile dosyanıza aktarmak olabilir. Ancak bu aşırı kaynak gerektirir.


1

Kodlamayı ve satır sonlarını korumak için:

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

Not: AFAIR, parametreleri eski Powershells tarafından desteklenmeyen (<3? <4?)


0

Sanırım "powershell yolu" şöyle olabilir:

set-content destination.log -value (get-content c:\FileToAppend_*.log )
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.