Verschiedene Textdateien aus einem Ordner zusammen fügen mit Überschrift der entsprechenden TXT-Datei
Hallo Leute
ich bin neu hier und ich weiß nicht 100%ig, ob diese frage in dieser Form schon einmal gestellt wurde.
Ich würde mich freuen, wenn mir jemand helfen könnte. ich habe leider mit PowerShell noch keine Erfahrung machen können und ich habe vielleicht ein spezielles Thema o. Anliegen. Ich habe einen Windows Server 2012R2 und die Frage ist beruflich.
Folgendes:
Ich habe ca. 20 Verzeichnisse mit jeweils einer X-Anzahl an TXT-Dokumenten
Die Verzeichnisnamen (der Ordner) und der Inhalt, die TXT-Dokumente, haben immer denselben Namen und ändern sich nicht.
Im Ordner sind ca. 30 TXT-Dateien, wovon ich 14 TXT-Dateien nur benötige.
Das bleibt aber gleich und ändert sich nicht, wie schon erwähnt.
Bsp:
Ordner Baum
Ordner Tisch
Ordner Stift
Ordner Heft usw....
In diesen Ordnern befinden folgende TXT-Dateien:
Im Ordner Baum -> grün.txt
blau.txt
rot.txt
gelb.txt usw.....
Aufbau TXT:
Normale textwerte, können aber auch Tabellenwerte enthalten.
Da ja der Inhalt kopiert wird, sollte der Aufbau ja nicht verändert werden.
Auf Arbeit sind diese Daten in einer Txt-Datei enthalten.
dies sind unteranderem Code-Logs o. Event-Logs o. anderes.
Wie gesagt, die Ordnernamen ändern sich nicht und die namen der TXT-Dateien ändern sich nicht.
Außer, der Inhalt.
Aufgabe:
ich muss den Inhalt aus den TXT-Dateien (grün, blau, rot, gelb usw...) in eine Txt-Datei zusammen fügen und in ein anderes zentrales Verzeichnis ablegen. Bis dahin wahrscheinlich einfach für Euch
Was ich aber jetzt benötige ist, wenn die TXT-Dateien zusammen gefügt werden, das der Name der angefügten TXT-Datei als Überschrift zur optischen Trennung erscheint.
Sprich, ich habe eine TXT Datei mit dem gesamten Inhalt aller als Beispiel oben genannten Dateien mit einer Überschrift.
Die Überschrift / Trennung inerhalb der Datei ist dann der name der ursprünglichen Datei.
Also, ich habe jetzt 20 TXT-Dateien zusammen gefügt zu einer und suche nach dem Wort: rot.txt.
Dadurch lande ich ja dann an die entsprechende Stelle, wo das rot.txt anfängt.
Oder meinetwegen, wo der inhalt der Event.log anfangen würde.
Das ist mein Ziel oder aktuell ehr der Wunsch.
Ich hoffe, Ihr könnt mir folgen...
Etwas kompliziert zu formulieren.
Ich danke schon einmal vorab und hoffe, es kann mir jemand helfen
Vielen lieben Dank
ich bin neu hier und ich weiß nicht 100%ig, ob diese frage in dieser Form schon einmal gestellt wurde.
Ich würde mich freuen, wenn mir jemand helfen könnte. ich habe leider mit PowerShell noch keine Erfahrung machen können und ich habe vielleicht ein spezielles Thema o. Anliegen. Ich habe einen Windows Server 2012R2 und die Frage ist beruflich.
Folgendes:
Ich habe ca. 20 Verzeichnisse mit jeweils einer X-Anzahl an TXT-Dokumenten
Die Verzeichnisnamen (der Ordner) und der Inhalt, die TXT-Dokumente, haben immer denselben Namen und ändern sich nicht.
Im Ordner sind ca. 30 TXT-Dateien, wovon ich 14 TXT-Dateien nur benötige.
Das bleibt aber gleich und ändert sich nicht, wie schon erwähnt.
Bsp:
Ordner Baum
Ordner Tisch
Ordner Stift
Ordner Heft usw....
In diesen Ordnern befinden folgende TXT-Dateien:
Im Ordner Baum -> grün.txt
blau.txt
rot.txt
gelb.txt usw.....
Aufbau TXT:
Normale textwerte, können aber auch Tabellenwerte enthalten.
Da ja der Inhalt kopiert wird, sollte der Aufbau ja nicht verändert werden.
Auf Arbeit sind diese Daten in einer Txt-Datei enthalten.
dies sind unteranderem Code-Logs o. Event-Logs o. anderes.
Wie gesagt, die Ordnernamen ändern sich nicht und die namen der TXT-Dateien ändern sich nicht.
Außer, der Inhalt.
Aufgabe:
ich muss den Inhalt aus den TXT-Dateien (grün, blau, rot, gelb usw...) in eine Txt-Datei zusammen fügen und in ein anderes zentrales Verzeichnis ablegen. Bis dahin wahrscheinlich einfach für Euch
Was ich aber jetzt benötige ist, wenn die TXT-Dateien zusammen gefügt werden, das der Name der angefügten TXT-Datei als Überschrift zur optischen Trennung erscheint.
Sprich, ich habe eine TXT Datei mit dem gesamten Inhalt aller als Beispiel oben genannten Dateien mit einer Überschrift.
Die Überschrift / Trennung inerhalb der Datei ist dann der name der ursprünglichen Datei.
Also, ich habe jetzt 20 TXT-Dateien zusammen gefügt zu einer und suche nach dem Wort: rot.txt.
Dadurch lande ich ja dann an die entsprechende Stelle, wo das rot.txt anfängt.
Oder meinetwegen, wo der inhalt der Event.log anfangen würde.
Das ist mein Ziel oder aktuell ehr der Wunsch.
Ich hoffe, Ihr könnt mir folgen...
Etwas kompliziert zu formulieren.
Ich danke schon einmal vorab und hoffe, es kann mir jemand helfen
Vielen lieben Dank
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 512732
Url: https://administrator.de/contentid/512732
Ausgedruckt am: 22.11.2024 um 18:11 Uhr
20 Kommentare
Neuester Kommentar
Moin,
wenn ich Dich richtig verstanden habe, dann liegen alle Dateien in einem Verzeichnis und alle txt daraus werden auch benötigt. Unterverzeichnisse gibt es keine. Richtig? Dann ist das nicht weiter schwer:
Aufruf wäre dann zu Beispiel:
(Nicht getestet, keine Zeit)
hth
Erik
wenn ich Dich richtig verstanden habe, dann liegen alle Dateien in einem Verzeichnis und alle txt daraus werden auch benötigt. Unterverzeichnisse gibt es keine. Richtig? Dann ist das nicht weiter schwer:
PARAM (
$quellpfad,
$zieldatei
)
$files = get-childitem $quellpfad\*.txt
foreach($file in $files) {
$content = get-content $file
out-file -inputObject $file.fullname -filepath $zieldatei -append
out-file -inputObject $content -filepath $zieldatei -append
$content = ""
}
Aufruf wäre dann zu Beispiel:
scriptname.ps1 -quellpfad c:\daten\baum -zieldatei \\server\zentraleAblage\baum.txt
(Nicht getestet, keine Zeit)
hth
Erik
Moin,
Soll vorkommen.
Das bleibt so. Das sind Parameter, die Du beim Aufruf des Skripts angeben musst.
Ja
Ja. Dazu noch ein Hinweis: Im Standard ist die Ausführung von Skripts auf der PS ausgeschaltet. Was dahinter steckt und wie Du das änderst, erfährst Du hier: https://www.windowspro.de/script/ausfuehrungsrichtlinien-executionpolicy ...
Gerne.
Liebe Grüße
Erik
Soll vorkommen.
Frage:
1. muss ich hier den Pfad angeben o. bleibt das so?
$quellpfad,
$zieldatei
1. muss ich hier den Pfad angeben o. bleibt das so?
$quellpfad,
$zieldatei
Das bleibt so. Das sind Parameter, die Du beim Aufruf des Skripts angeben musst.
2. wird der große Code seperat abgespeichert
Ja
und das: scriptname.ps1 -quellpfad c:\daten\baum -zieldatei \\server\zentraleAblage\baum.txt
seperat gestartet??
seperat gestartet??
Ja. Dazu noch ein Hinweis: Im Standard ist die Ausführung von Skripts auf der PS ausgeschaltet. Was dahinter steckt und wie Du das änderst, erfährst Du hier: https://www.windowspro.de/script/ausfuehrungsrichtlinien-executionpolicy ...
Danke nochmal für deine Hilfe
Gerne.
Liebe Grüße
Erik
Moin,
Das vor der Meldung, nämlich was nicht als Befehl erkannt wurde, ist das interessante. Das ist meist ein Tippfehler. Ich konnte in meinem Skript aber keinen entdecken.
<edit>Enthalten Deine Pfade zur Quelle oder zum Ziel Leerzeichen? Dann musst Du die Angabe in Anführungszeichen setzen.</edit>
Liebe Grüße
Erik
Zitat von @ZTommy:
is not recognized as the name of a cmdlet function script file or operable program
is not recognized as the name of a cmdlet function script file or operable program
Das vor der Meldung, nämlich was nicht als Befehl erkannt wurde, ist das interessante. Das ist meist ein Tippfehler. Ich konnte in meinem Skript aber keinen entdecken.
<edit>Enthalten Deine Pfade zur Quelle oder zum Ziel Leerzeichen? Dann musst Du die Angabe in Anführungszeichen setzen.</edit>
Liebe Grüße
Erik
Zitat von @ZTommy:
is not recognized as the name of a cmdlet function script file or operable program
is not recognized as the name of a cmdlet function script file or operable program
Wird vermutlich daran liegen das der vollständige Pfad zum Skript oder das führende .\ für den aktuellen Pfad fehlen, fehlt hier ja im geposteten Aufruf:
Zitat von @erikro:
Aufruf wäre dann zu Beispiel:
Aufruf wäre dann zu Beispiel:
scriptname.ps1 -quellpfad c:\daten\baum -zieldatei \\server\zentraleAblage\baum.txt
.\scriptname.ps1 -quellpfad "c:\daten\baum" -zieldatei "\\server\zentraleAblage\baum.txt"
"C:\Pfad\scriptname.ps1" -quellpfad "c:\daten\baum" -zieldatei "\\server\zentraleAblage\baum.txt"
Zitat von @ZTommy:
und hier auch nochmal ein Hallo und danke Dir
sehr schön...
Auch hier nochmal ein paar Eckdaten:
1. das Verzeichnis bleibt immer gleich
2. es sind eventuell auch nur bestimmte TXT-Dateien, die benötigt werden (von 20 nur 15 Dateien)
diese muss ich dann einzeln aufführen
3. es gibt keine Unterverzeichnisse, selbst wenn, ist dies unrelevant
mal ein Beispiel, wie die TXT-Datei vom Inhalt her aussehen muss:
Im Ordner Baum gibt es folgende TXT-Dateien:
grün.txt
blau.txt
rot.txt
gelb.txt usw....
in der erstellten TXT muss es nun so aussehen:
Name der eingepflegten TXT:
grün.txt (als Überschrift / Marker)
Text / Inhalt der grün.TXT
Text
Text
Text..........
blau.txt
Text
Text
Text
Text...........
rot.txt
Text
Text
Text
Text..........
Das muss dann alles in einer bzw. der zusammengeführten TXT stehen.
und hier auch nochmal ein Hallo und danke Dir
sehr schön...
Auch hier nochmal ein paar Eckdaten:
1. das Verzeichnis bleibt immer gleich
2. es sind eventuell auch nur bestimmte TXT-Dateien, die benötigt werden (von 20 nur 15 Dateien)
diese muss ich dann einzeln aufführen
3. es gibt keine Unterverzeichnisse, selbst wenn, ist dies unrelevant
mal ein Beispiel, wie die TXT-Datei vom Inhalt her aussehen muss:
Im Ordner Baum gibt es folgende TXT-Dateien:
grün.txt
blau.txt
rot.txt
gelb.txt usw....
in der erstellten TXT muss es nun so aussehen:
Name der eingepflegten TXT:
grün.txt (als Überschrift / Marker)
Text / Inhalt der grün.TXT
Text
Text
Text..........
blau.txt
Text
Text
Text
Text...........
rot.txt
Text
Text
Text
Text..........
Das muss dann alles in einer bzw. der zusammengeführten TXT stehen.
# Ordner in dem die Dateien liegen
$ordner = 'D:\DeinOrdner '
# nur die Dateien auflisten die gewünscht sind
$dateinamen = 'datei1.txt','datei2.txt','datei3.txt'
# Ausgabedatei
$ausgabe = 'D:\DeinOrdner\ergebnis.txt'
# Action ...
Get-ChildItem "$ordner\*" -File -Include $dateinamen | %{$_.Name,(Get-Content $_.FullName)} | Set-Content $ausgabe
Nicht vergessen:
Wie kann ich einen Beitrag als gelöst markieren?
Na dann
# RootOrdner in dem die Unterordner liegen
$ordner = 'D:\DeinOrdner'
# nur die Dateien auflisten die gewünscht sind
$dateinamen = 'datei1.txt','datei2.txt','datei3.txt'
# Action ...
$ausgabeordner = 'D:\Ausgabe'
Get-ChildItem $ordner -Directory -PipelineVariable folder | %{
Get-ChildItem "$($folder.Fullname)\*" -File -Include $dateinamen | %{$_.Name,(Get-Content $_.FullName)} | Set-Content "$ausgabeordner\$($folder.Name).txt"
}
Oben bei Zeile 7 kannst du mit -Include einschränken genau so wie oben in Zeile 8
Sieht dann so aus
Sieht dann so aus
# RootOrdner in dem die Unterordner liegen
$ordner = 'D:\DeinOrdner'
# Unterordner
$unterordner = 'Ordner1','Ordner2','Ordner3'
# nur die Dateien auflisten die gewünscht sind
$dateinamen = 'datei1.txt','datei2.txt','datei3.txt'
# Ausgabeordner
$ausgabeordner = 'D:\Ausgabe'
Get-ChildItem "$ordner\*" -Include $unterordner -Directory -PipelineVariable folder | %{
Get-ChildItem "$($folder.Fullname)\*" -File -Include $dateinamen | %{$_.Name,(Get-Content $_.FullName)} | Set-Content "$ausgabeordner\$($folder.Name).txt"
}
Moin,
schön, dass es geklappt hat.
Klar geht das:
Dann schreibst Du in Deine input.csv:
hth
Erik
schön, dass es geklappt hat.
Zitat von @ZTommy:
Eine Frage habe ich aber noch, bevor ich meine Frage als gelöst markiere
Wie ganz oben erwähnt, hab ich ca. 20 Verzeichnisse.
Ich kann natürlich Eure beiden Lösungen für 20 Verzeichnisse machen.
Aber, kann ich das nicht so machen, das die Abfrage über die 20 Verzeichnisse geht und dann getrennt voneinander 20 Ergebnis.txt erstellt?
Eine Frage habe ich aber noch, bevor ich meine Frage als gelöst markiere
Wie ganz oben erwähnt, hab ich ca. 20 Verzeichnisse.
Ich kann natürlich Eure beiden Lösungen für 20 Verzeichnisse machen.
Aber, kann ich das nicht so machen, das die Abfrage über die 20 Verzeichnisse geht und dann getrennt voneinander 20 Ergebnis.txt erstellt?
Klar geht das:
PARAM (
$inputcsv
)
function get-filenames {
PARAM (
$quellpfad,
$zieldatei
)
$files = get-childitem $quellpfad\*.txt
foreach($file in $files) {
$content = get-content $file
out-file -inputObject $file.fullname -filepath $zieldatei -append
out-file -inputObject $content -filepath $zieldatei -append
$content = ""
}
}
$directory-list = import-csv $inputcsv -delimiter ";"
foreach($dir in $directory-list) {
get-filenames $dir.quelle $dir.ziel
}
Dann schreibst Du in Deine input.csv:
quelle;ziel
quellpfad1;zieldatei1
quellpfad2;zieldatei2
...
hth
Erik