v.piepmatz
Goto Top

Batch: Mehrere .txt Dateien zu einer zusammenfügen, dabei jeweils die erste Zeile löschen

Hallo,

ich bin leider kompletter Neueinsteiger bzgl. batch-Dateien, suche jetzt aber eine Möglichkeit mehrere .txt Dateien, welche in einem Verzeichnis liegen, zu einer Datei zusammen zu fügen.
Dabei sollte jede Ursprungsdatei in eine neue Zeile der neuen Datei eingefügt werden und es sollte jeweils die erste Zeile gelöscht werden.

Kann mir vielleicht jemand helfen? face-smile
Danke!

Content-Key: 343647

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

Ausgedruckt am: 19.03.2024 um 08:03 Uhr

Mitglied: Friemler
Lösung Friemler 18.07.2017 aktualisiert um 01:19:24 Uhr
Goto Top
Hallo piepmatz,

teste mal folgendes:
@echo off & setlocal

::======= Konfiguration =========
set "RootFolder=%UserProfile%\Desktop"  
set "FileNamePattern=*.txt"  
set "FileList=D:\FileList.txt"  
set "OutFile=D:\bla.txt"  
::===============================


::Wenn die Dateiliste bereits angelegt wurde soll sie benutzt werden
if exist "%FileList%" goto :ReadFromFile  

::Ansonsten wird die Dateiliste aus den Angaben
::RootFolder und FileNamePattern erstellt
>"%FileList%" (  
  for %%f in ("%RootFolder%\%FileNamePattern%") do (  
    echo %%f
  )
)

::Die Dateinamen aus der Dateiliste einlesen und den Inhalt der Dateien
::abzüglich der ersten Zeile in die Zieldatei schreiben, Leerzeilen incl.
:ReadFromFile
>"%OutFile%" (  
  for /f "usebackq delims=" %%a in ("%FileList%") do (  
    for /f "skip=1 tokens=1* delims=:" %%b in ('findstr /n "^" "%%a"') do (  
      echo(%%c
    )
  )
)
  1. In Zeile 4 das Verzeichnis eintragen, in dem Deine Quelldateien liegen.
  2. Entweder
    • in Zeile 5 eine Dateinamensmaske eintragen oder
    • in Zeile 6 den Pfad zu einer bereits existierenden Datei eintragen, die die vollständigen Pfade zu den zu verarbeitenden Dateien enthält.
  3. In Zeile 7 den vollständigen Pfad zur Zieldatei eintragen.

Wenn Du die Lösung mit der Dateinamensmaske nimmst, werden alle Dateien aus dem Quellverzeichnis, auf die die Maske passt, in alphabetischer Reihenfolge eingelesen und in die Zieldatei geschrieben.

Wenn Du vor dem Scriptlauf selbst eine Datei mit einer Liste der zu verarbeitenden Dateien erstellst, kannst Du die Reihenfolge, in der die Dateien verarbeitet werden, selbst bestimmen.

Falls die Namen Deiner Quelldateien z.B. deutsche Umlaute oder andere Sonderzeichen enthalten, musst Du die Datei mit der Dateinamensliste in der Zeichencodierung OEM 850 speichern. Das geht z.B. mit dem kostenlosen Editor Notepad++.

Grüße
Friemler
Mitglied: v.piepmatz
v.piepmatz 18.07.2017 um 10:06:17 Uhr
Goto Top
Vielen Dank schon mal für deine Hilfe!
Also gerade sieht mein Code wie folgt aus. Ich weiß nicht ob ich den Path des RootFolders richtig angegeben habe? Hier hatte ich aber auch verschiedene Varianten ausprobiert.
Und ob die Angaben bei dem "FileNamePattern" richtig sein? Heißt "*.txt", dass alle Dateien mit einer .txt-Endung in diesem Ordner gelesen werden sollen?
Auf jeden Fall wird die Ausgabe-Datei erstellt, nur leider noch ohne Inhalt!

@echo off & setlocal

::======= Konfiguration =========
set "RootFolder=C:\Users\klinpsych\Desktop\logfiles"  
set "FileNamePattern=*.txt"  
set "OutFile=C:\Users\klinpsych\Desktop\logfiles\bla.txt"  
::===============================

>"%FileList%" (  
  for %%f in ("%RootFolder%\%FileNamePattern%") do (  
    echo %%f
  )
)

:ReadFromFile
>"%OutFile%" (  
  for /f "usebackq delims=" %%a in ("%FileList%") do (  
    for /f "skip=1 tokens=1* delims=:" %%b in ('findstr /n "^" "%%a"') do (  
      echo(%%c
    )
  )
)
Mitglied: Friemler
Lösung Friemler 18.07.2017 um 11:04:28 Uhr
Goto Top
Moin piepmatz,

ich hatte mich wohl missverständlich ausgedrückt. Du darfst Die Variable FileList (Zeile 6 in meinem Script) nicht komplett entfernen.

Wenn Du die Dateiliste nicht selbst erstellen möchtest, musst Du in der Variablen FileList trotzdem den Pfad zu einer Datei angeben, in die das Script seine selbst erstellte Dateiliste hinein schreiben kann. In dem Fall solltest Du evtl. noch ein
del "%FileList%" > NUL
als letzte Zeile an das Script anhängen, damit das Script keinen "Müll" hinterlässt.

Die Variable FileNamePattern musst Du auf einen Wert setzen, der Deinen Anforderungen entspricht. Wenn Du bspw. alle Dateien im Quellverzeichnis unabhängig von ihrer Dateierweiterung verarbeiten möchtest, muss FileNamePattern den Wert *.* haben. Und ja, mit *.txt erwischst Du alle Dateien mit der Endung .txt.

Ob das Verzeichnis, das Du als RootPath angegeben hast, auch existiert, kannst leider nur Du selbst überprüfen. face-wink

Du hast leider in Deinem Eröffnungsposting zu wenig Angaben zu Deinen Anforderungen gemacht (z.B. Welche Dateien (alle, oder nur bestimmte) sollen kopiert werden? In welcher Reihenfolge (alphabetisch sortiert nach ihrem Namen oder gibt es dazu bestimmte Vorgaben) sollen die Quelldateien in die Zieldatei geschrieben werden?). Ich habe deshalb versucht, Dir eine generische Lösung zu bauen, die Du an Deine Erfordernisse anpassen kannst. Dadurch wird eine Lösung natürlich immer etwas komplexer, als wenn man nur genau einen bestimmten Fall programmieren muss.

Grüße
Friemler
Mitglied: v.piepmatz
v.piepmatz 18.07.2017 um 11:27:17 Uhr
Goto Top
Vielen Dank es funktioniert!
Mitglied: Friemler
Friemler 18.07.2017 um 11:47:56 Uhr
Goto Top
Freut mich. Wie wäre es dann noch mit einem grünen Haken? face-wink