2017-04-07 6 views
0

Ich versuche, eine Textdatei zu erstellen, die den Inhalt meiner verketteten Quellcode-Dateien enthält. Ich habe kam mit dem folgenden prägnanten Code auf:Kombinieren von Text aus mehreren Dateien in einer einzigen Datei

Get-ChildItem -Recurse MySourcePath -Include "*.htm", "*.cs" | Foreach-Object 
{Get-Content $_.FullName | Add-Content MyFile.txt} 

Das Problem ist, nach mehreren Dateien (Hunderte oder Tausende), ich fange an die folgenden Fehler zu erhalten:

Add-Content : The process cannot access the file 'MyFile.txt' because it is being used by another process.

Es scheint, wie Concurrency Problem und ich dachte, es war mit dem Pipelining-Mechanismus verwandt, aber foreach löste das Problem nicht.

Was ist der richtige Weg in der PowerShell, um meine Datei vor mehreren Schreibvorgängen zu schützen? Gibt es eine Möglichkeit, die Pipeline noch zu nutzen?

Antwort

1

Wie erklärt here, Ihr Problem ist Add-Inhalt, tun Sie es einfach

Get-ChildItem $MySourcePath -Recurse -Include "*.htm", "*.cs" | get-content | Out-File -Append MyFile.txt 



#short version 
gci -file $MySourcePath -Recurse -Include "*.htm", "*.cs" | gc >> MyFile2.txt 
+0

Es hat den Trick! Ich könnte mir nicht vorstellen, dass es kürzer (und besser) werden könnte ... Was ist deine persönliche Vorliebe? Verwenden Sie die vollständigen Cmdlet-Namen oder die Verknüpfungen? –

+1

Ich bevorzuge Cmdletname, bessere Lisibility;) – Esperento57

0

Sie können Rohr Get-ChildItem zu Out-File die Dateien zu kombinieren, es ist nur ein einziger Schreibvorgang dann:

Get-ChildItem MySourcePath -Include "*.htm", "*.cs" -Recurse | Out-File MyFile.txt 
+0

Ich habe das versucht, aber es erstellt nur eine Textdatei mit allen Dateinamen. Ich brauche den gesamten Dateiinhalt (d. H. Den Quellcode), der in eine einzelne Datei verkettet werden soll. Sie haben auch meine Frage nicht beantwortet, was das Problem mit dem ist, was ich anfänglich versucht habe ... –

Verwandte Themen