2016-11-10 1 views
0

ich eine Reihe von Text-Dateien habe jeweils das gleiche in Unterordner eines bestimmten Verzeichnisses mit dem NamenBatch zu bekommen Linien zwischen zwei Strings in mehreren Textdateien in Unterordner

ac.txt Dateien haben die folgende Struktur:

Ich möchte alle diese Zeilen zwischen Strings [Lichter] und [GetEngineData] (einschließlich der Start [Lichter] und Enden [GetEngineData] Zeilen) in einer einzigen Ausgabedatei namens lights.txt mit einem Leerzeichen in zwischen denen aus jeder Textdatei kommen.

I codiert die folgende Partie aber es ist nicht von so weit Erfolg:

@ECHO OFF 
for /r %%a in ('find /n "[lights]"^<(ac.txt) ') do set /a start=%%a 
for /r %%a in ('find /n "[GeneralEngineData]"^<(ac.txt) ') do set /a end=%%a 
(
    for /r %%a in ('find /n /v ""^<(ac.txt) ') do (
     IF %%a geq %start% IF %%f leq %end% ECHO(%%b 
    ) 
)>lights.txt 
+1

Sie können 'FOR/R' nicht verwenden, um die Ausgabe eines Befehls zu verarbeiten. Verwenden Sie "FOR/F", um dies zu tun. Ich bin mir nicht sicher, was Sie versuchen, die Dateimaske in Klammern zu setzen. – Squashman

+1

Mögliches Duplikat von [Batch File - Finde zwei Zeilen und kopiere dann alles zwischen diesen Zeilen] (http://stackoverflow.com/questions/33638832/batch-file-find-two-lines-then-copy-everything-between-those (Zeilen) – aschipfl

+0

Sie haben angegeben, dass Ihre Textdateien "alle gleich benannt" sind. Warum suchen Sie also in jeder Datei mit der Erweiterung .txt und nicht nur in der bekannten Datei Dateiname.txt? – Compo

Antwort

0

Hier ist ein Weg, es zu tun. Könnte nicht die effizienteste sein, aber es scheint die Arbeit gut zu machen. Der Code durchläuft alle Unterordner und nimmt alle .TXT Dateien auf. Dann analysiert es jede Zeile jeder Datei, markiert den Anfang/das Ende jedes Blocks mit den Tokens [lights] und [GeneralEngineData] und gibt dann alles in res.txt im selben Ordner aus, in dem die Batch-Datei gespeichert ist.

@ECHO OFF 
Setlocal EnableDelayedExpansion 
if exist res.txt del res.txt 

set inblock=0 
for /r . %%a in (*.txt) do (
    set fname=%%a 
    for /f "tokens=1* delims=]" %%b in ('type "!fname!" ^| find /n /v ""') do (
     if /i *%%c*==*[lights]* set inblock=1 
     if !inblock!==1 (
      if *%%c*==** (echo.) else (echo %%c) 
      if /i *%%c*==*[GetEngineData]* set inblock=0 
     ) 
    ) 
    echo. 
) >> res.txt 
set fname= 
set inblock= 
type res.txt 
+0

ich gebe es in Kürze – kvari

+0

, dass man gut funktioniert, danke! habe gerade '/ i' in' if'-Anweisungen hinzugefügt, um eine mögliche Groß-/Kleinschreibung zu ignorieren. – kvari

+0

es ist nur fehlgeschlagen, Satz von Daten zwischen '[Lichter]' und '[GeneralEngineData]' hinzuzufügen, falls es eine Leerzeile direkt nach '[lights]' Zeilen gibt. – kvari

Verwandte Themen