webentwicklung-frage-antwort-db.com.de

Wie verkette ich zwei Textdateien in PowerShell?

Ich versuche, die Funktionalität des Befehls "cat" in Unix zu replizieren.

Ich möchte Lösungen vermeiden, bei denen ich beide Dateien explizit in Variablen einlese, die Variablen miteinander verkettet und dann die verkettete Variable ausschreibe.

93
merlin2011

Sie können einfach cat example1.txt, example2.txt | sc examples.txt Verwenden. Mit diesem Stil können Sie sicher auch mehr als zwei Dateien verketten. Wenn die Dateien einen ähnlichen Namen haben, können Sie außerdem Folgendes verwenden:

cat example*.txt | sc allexamples.txt

Das cat ist ein Alias ​​für Get-Content , und sc ist ein Alias ​​für Set-Content .

Hinweis 1 : Gehen Sie bei der letzteren Methode vorsichtig vor - wenn Sie versuchen, eine Ausgabe auf examples.txt (Oder einer ähnlichen Methode, die dem Muster entspricht), PowerShell, durchzuführen gerät in eine Endlosschleife! (Ich habe das gerade getestet).

Hinweis 2 : Bei der Ausgabe in eine Datei mit > Bleibt die Zeichenkodierung nicht erhalten! Aus diesem Grund wird die Verwendung von Set-Content (sc) empfohlen.

133
Smi

Verwende nicht >; es bringt die Zeichenkodierung durcheinander. Verwenden:

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

In cmd können Sie dies tun:

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

In PowerShell wäre dies:

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

Während der PowerShell-Weg wäre, gc zu verwenden, wird das oben Genannte ziemlich schnell sein, insbesondere für große Dateien. Und es kann auch für nicht - ASCII Dateien verwendet werden, indem /B Schalter.

13
manojlds

Sie können das Cmdlet Add-Content verwenden. Vielleicht ist es etwas schneller als die anderen Lösungen, weil ich den Inhalt der ersten Datei nicht abrufe.

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

Dateien in der Eingabeaufforderung zu verketten wäre es

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

Powershell konvertiert den Befehl "type" in "Get-Content". Dies bedeutet, dass bei Verwendung des Befehls "type" in Powershell ein Fehler auftritt, da für den Befehl "Get-Content" ein Komma zwischen den Dateien erforderlich ist. Das gleiche Kommando in Powershell wäre

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

4
Brian Kimball

Wenn Sie die Dateien nach bestimmten Parametern (z. B. Datum und Uhrzeit) bestellen müssen:

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

Ich benutzte:

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

Dies fügte gut. Ich habe die ASCII Codierung hinzugefügt, um die Nullzeichen zu entfernen, die Notepad ++ ohne die explizite Codierung angezeigt hat.

3
Phoenix14830

Da bei den meisten anderen Antworten die Formatierung häufig falsch ist (aufgrund der Pipe), ist Folgendes am sichersten:

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

Ich weiß, dass Sie vermeiden wollten, den Inhalt von $ SomeAdditionalFile in eine Variable zu lesen, aber um zum Beispiel Ihre Zeilenumbruch-Formatierung zu speichern, denke ich, dass es keinen richtigen Weg gibt, ohne den Sie dies tun können.

Eine Problemumgehung wäre, Ihre $ SomeAdditionalFile zeilenweise zu durchlaufen und diese in Ihre $ YourMasterFile zu leiten. Dies ist jedoch zu ressourcenintensiv.

2
Kamaradski

Sie können etwas tun wie:

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

Woher > ist ein Alias ​​für "out-file" und >> ist ein Alias ​​für "out-file-append".

1
vlad-ardelean

Ich denke, der "Powershell-Weg" könnte sein:

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