Eines der Hauptprobleme in Ihrer Logik besteht darin, dass Sie die Variable "import" einmal setzen, wenn etwas wahr ist, aber niemals zurücksetzen oder sie undefiniert, wenn sie nicht mehr stimmt. Nach dem ersten Einstellen bleibt es für den Rest der Schleife "definiert".
Meine Präferenz ist es, die Variable spezifisch einzustellen ( true
oder false
). Stellen Sie es false
auf Start ein, legen Sie es dann true
wie gewünscht fest, aber stellen Sie auch sicher, dass Sie es wieder auf den gewünschten Zeitpunkt einstellen false
. Überprüfen Sie dann bei jeder Iteration der Schleife, ob die Variable speziell festgelegt ist True
oder False
nicht, ob sie gerade definiert ist.
Dieser Code funktioniert für mich basierend auf Ihren Informationen / Zielen:
@echo off setlocal EnableDelayedExpansion set buildlog=test.txt set import=false for /F "tokens=*" %%A in (%buildlog%) do ( if /i "%%A"=="Import:" ( set import=true ) if /i "%%A"=="View:" ( set import=false ) if !import!==true ( if not "%%A"=="Import:" ( for /F "tokens=1" %%B in ("%%A") do ( echo %%B ) ) ) )
Wir setzen die Variable "Import" (Flag) absichtlich false
auf Start.
Die erste For-Schleife durchläuft jede Zeile in der Datei ( test.txt
in diesem Beispiel, wie durch die Variable "buildlog" angegeben; Hinweis: Sie müssen die Anführungszeichen um den Dateinamen in der Variablen entfernen, damit sie in der For-Schleife funktioniert). .
Die erste IF sieht, ob die aktuelle Zeile die Zeile "Import:" ist, und wenn ja, wird das Flag "Import" auf "1" gesetzt true
.
Bei der nächsten IF wird angezeigt, ob die aktuelle Zeile die Zeile "View:" ist, und wenn ja, wird das Flag "import" (zurück zu) zurückgesetzt false
, sodass die Verarbeitung jeder Zeile beendet wird.
Die 3. IF prüft, ob das "Import" -Flag gesetzt ist true
, und wenn ja, verarbeitet es die Zeile.
Wenn dies true
der Fall ist, prüft die verschachtelte (4.) IF, ob die Zeile tatsächlich die Zeile "import:" ist. Wenn nicht, wird die Zeile angezeigt (verhindert, dass die Zeile "Import:" in der Ausgabe angezeigt wird).
Die zweite For-Schleife geht durch die Zeile, die angezeigt werden soll, und zieht nur den ersten Token-Satz, der (nur) der Pfad ist, den Sie möchten, und lässt den #head
.
Weitere / verwandte Informationen:
- Variable Erweiterung in FOR-Loops
- Wie teilt man eine Zeichenfolge in einer Windows-Batchdatei auf?
- Logische Operatoren (“und”, “oder”) im DOS-Stapel
Nach Kommentaren bearbeiten:
Um mit der Zeile "View:" umzugehen, wenn hinter dieser eine Versionsnummer steht, können Sie den Code folgendermaßen ändern:
@echo off setlocal EnableDelayedExpansion set buildlog=test.txt set import=false for /F "tokens=*" %%A in (%buildlog%) do ( for /F "tokens=1" %%B in ("%%A") do ( if /i "%%B"=="Import:" ( set import=true ) if /i "%%B"=="View:" ( set import=false ) if !import!==true ( if not "%%B"=="Import:" ( for /F "tokens=1" %%C in ("%%A") do ( echo %%C ) ) ) ) )
Diese hinzugefügte For-Schleife zieht das erste Token aus der Zeile, um zu prüfen, ob es "View:" oder "Import:" ist, anstatt die gesamte Zeile zu überprüfen. Ignorieren Sie nach dem ersten Leerzeichen in der Zeile, um die Überprüfung durchzuführen.