ztommy
Goto Top

Verschiedene Textdateien aus einem Ordner zusammen fügen mit Überschrift der entsprechenden TXT-Datei

Hallo Leute face-smile

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 face-smile

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... face-sad
Etwas kompliziert zu formulieren.

Ich danke schon einmal vorab und hoffe, es kann mir jemand helfen face-smile
Vielen lieben Dank

Content-ID: 512732

Url: https://administrator.de/contentid/512732

Ausgedruckt am: 22.11.2024 um 18:11 Uhr

erikro
erikro 07.11.2019 um 12:24:52 Uhr
Goto Top
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:

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
ZTommy
ZTommy 07.11.2019 um 14:08:24 Uhr
Goto Top
und hier auch nochmal ein Hallo und danke Dir face-smile

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.

Ich hoffe, ist jetzt besser erklärt....
Ich denke mal, hier muss mit vielen Schleifen gearbeitet werden... face-sad

Danke und Grüße
erikro
erikro 07.11.2019 um 14:56:13 Uhr
Goto Top
Hast Du das Skript, das ich schnell geschrieben habe, mal ausprobiert. Das sollte das tun, was Du willst.
ZTommy
ZTommy 08.11.2019 um 10:13:10 Uhr
Goto Top
Hallöchen face-smile

sorry, das ich jetzt erst schreibe... face-sad
musste privat gestern "weg"...

ja, habe versucht noch zu testen...
Aber bekomme es nicht hin.
Leider noch nie mit zu tun gehabt... face-sad


Frage:

1. muss ich hier den Pfad angeben o. bleibt das so?

$quellpfad,
$zieldatei

2. wird der große Code seperat abgespeichert und das: scriptname.ps1 -quellpfad c:\daten\baum -zieldatei \\server\zentraleAblage\baum.txt
seperat gestartet??

Danke nochmal für deine Hilfe face-smile
ist heutzutage leider nicht mehr so häufig...

Grüße
erikro
erikro 08.11.2019 um 10:44:11 Uhr
Goto Top
Moin,

Zitat von @ZTommy:
sorry, das ich jetzt erst schreibe... face-sad
musste privat gestern "weg"...

Soll vorkommen. face-wink

Frage:

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??

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 face-smile

Gerne.

Liebe Grüße

Erik
ZTommy
ZTommy 08.11.2019 um 12:53:59 Uhr
Goto Top
hallo Eric face-smile

einen herzlichen Dank nochmal an Dich face-smile

ich werde versuchen das heute bzw. am WE nochmal zu testen bzw. mir deinen Link anschauen.
Natürlich gebe ich auch nochmal Feedback face-smile

Ich danke Dir face-big-smile
ZTommy
ZTommy 08.11.2019 um 15:36:29 Uhr
Goto Top
Hallöchen face-smile

ich konnte nun mal testen und habe ein Problem beim ausführen.

ich bekomme folgende Fehlermeldung:

is not recognized as the name of a cmdlet function script file or operable program

Suche gerade im Netz, was das sein könnte.

Bei meinen Rechten bin ich mir nicht so sicher, das ich diese nicht haben sollte.
Grund: ich habe noch ein anderes Script mit Power Shell, womit ich mir einen Report per Mail automatisch vom Server zukommen lassen kann.
Auch dafür benötige ich Rechte. Das habe ich dadurch schon mal prüfen müssen.

Was ich mir vorstellen kann ist, dass ich eventuell das Skript von einem falschen "Ort" ausführe.
Weiß es aber nicht. Bin auf der Suche.
Vielleicht sehe ich auch gerade den Wald vor lauter bäumen nicht und denke zu kompliziert.

Aber für Dich das erstmal als Feedback face-smile

ich Danke Dir und wünsche nen schönen Feierabend face-big-smile
erikro
erikro 08.11.2019 aktualisiert um 15:48:27 Uhr
Goto Top
Moin,

Zitat von @ZTommy:
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
141815
141815 08.11.2019, aktualisiert am 09.11.2019 um 07:40:51 Uhr
Goto Top
Zitat von @ZTommy:
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:

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"  
141815
141815 11.11.2019 aktualisiert um 11:32:58 Uhr
Goto Top
Zitat von @ZTommy:

und hier auch nochmal ein Hallo und danke Dir face-smile

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?
ZTommy
ZTommy 11.11.2019 um 15:12:50 Uhr
Goto Top
Hallöchen Erik face-smile,

danke für deine Nachricht face-smile

der Fehler lag einerseits an: "scriptname.ps1 -quellpfad c:\daten\baum -zieldatei \\server\zentraleAblage\baum.txt"
da fehlte dann das Verzeichnis noch.
"C:\Pfad\scriptname.ps1" -quellpfad "c:\daten...."
Was aber nicht schlimm ist, da ich selbst auch den Fehler hatte, dass ich den falschen Namen der *.ps1 angegeben hatte.
Dadurch wahr es natürlich nicht möglich, das es funktioniert.
Ich hatte mich so auf die Schreibweise konzentriert, das ich den Namen garnicht beachtet hatte face-sad

Sorry, das ich jetzt erst schreibe.
Am WE keine Zeit gehabt und heute Vormittag habe ich rumgetestet, woran der Fehler liegt.
Wollte natürlich auch selbst was hinbekommen....,auch wenn es im Verhältnis zu Euch wenig ist...

Grüße face-smile
ZTommy
ZTommy 11.11.2019 um 15:13:28 Uhr
Goto Top
Achso Erik,

es hat soweit dann wunderbar geklappt face-smile

Grüße
ZTommy
ZTommy 11.11.2019 um 15:14:50 Uhr
Goto Top
Hallo Calendar face-smile,

auch Dir einen Dank für den bzw. die Tipps face-smile

Auch deine variante klappt wunderbar face-smile

Getestet und läuft.

Grüße face-smile
ZTommy
ZTommy 11.11.2019 um 15:27:33 Uhr
Goto Top
Eine Frage habe ich aber noch, bevor ich meine Frage als gelöst markiere face-smile


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?

Die Verzeichnisnamen bleiben fest und die gewünschten TXT-Dateien bleiben auch vom Namen fest.
Da ändert sich nichts. Was max. passieren kann ist, das ein weiteres Verzeichnis hinzukommen kann.
Das es dann halt 21 sind.

Also kurz und kanpp, 20 Verzeichnisse durchgehen und den Ihnhalt von jedem Verzeichnis für sich in eine Ergebnis.txt einpflegen und erstellen und diese erstellten Dateien in ein bestimmtest Verzeichnis ablegen.
Die *Ergebnis.txt* kann natürlich so heißen, wie das Verzeichnis selbst.
z.B.: baum.txt, Grün.txt, Rot.txt usw....

Wenn machbar natürlich!!!

Grüße
141815
141815 11.11.2019 um 15:27:48 Uhr
Goto Top
Na dann
Zitat von @141815:
Nicht vergessen:
Wie kann ich einen Beitrag als gelöst markieren?
141815
141815 11.11.2019 aktualisiert um 15:37:22 Uhr
Goto Top
# 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"  
}
ZTommy
ZTommy 11.11.2019 um 15:47:17 Uhr
Goto Top
Hallo Calendar face-smile

das ging fix.... o_O

Frage:

in dem Root-Ordner liegen in der Folgeebene ca. 150 Ordner, wo ich nur 20 brauche.

Kann ich das dann so schreiben:

$ordner = 'D:\DeinOrdner\grün\','D:\DeinOrdner\rot\','D:\DeinOrdner\blau\' usw...?

Grüße
141815
Lösung 141815 11.11.2019 aktualisiert um 15:51:22 Uhr
Goto Top
Oben bei Zeile 7 kannst du mit -Include einschränken genau so wie oben in Zeile 8

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"  
}
ZTommy
ZTommy 11.11.2019 um 15:55:10 Uhr
Goto Top
Danke Dir face-smile

ich werde das Testen

Grüße
erikro
Lösung erikro 11.11.2019 um 16:24:41 Uhr
Goto Top
Moin,

schön, dass es geklappt hat.

Zitat von @ZTommy:

Eine Frage habe ich aber noch, bevor ich meine Frage als gelöst markiere face-smile


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