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.