Zeichenfolge mit Batch-Skript analysieren

4747
Mihir

Wie kann ich String mit Batch-Skript analysieren?

Ziel ist es, in einem Array alles unter zu speichern Import:und #headzum Beispiel -> //MPackages/Project/config/abc.txtund //Packages/Project/config/cde.txt.

test.txt:

Version: 4.5.0 Import: //MPackages/Project/config/abc.txt #head //Packages/Project/config/cde.txt #head View: //MPackages/Project/config/ac.txt #head //Packages/Project/config/de.txt #head 

Mein Versuch:

@echo off  set buildlog="devel.p4inc"  setlocal EnableDelayedExpansion for /F "tokens=*" %%A in (devel.p4inc) do ( if /i "%%A"=="Import:" set "import=true" IF DEFINED import (echo %%A) ) 

gewünschte Ausgabe

 //MPackages/Project/config/abc.txt  //Packages/Project/config/cde.txt 

alles unter Import:

2
Der Klarheit halber, was ist los mit dem, was Sie versucht haben? Welche Ergebnisse erzielen Sie damit (richtig oder falsch)? Ƭᴇcʜιᴇ007 vor 8 Jahren 0
Ergebnis war falsch .. es wird alles unter Import gedruckt: .. ich möchte nur //MPackages/Project/config/abc.txt und //Packages/Project/config/cde.txt ausdrucken .. Mihir vor 8 Jahren 0
Fügen Sie das gewünschte Ergebnis hinzu STTR vor 8 Jahren 0
zur ursprünglichen Frage hinzugefügt Mihir vor 8 Jahren 0

3 Antworten auf die Frage

1
Ƭᴇcʜιᴇ007

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 ( trueoder false). Stellen Sie es falseauf Start ein, legen Sie es dann truewie 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 Trueoder Falsenicht, 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 falseauf Start.

Die erste For-Schleife durchläuft jede Zeile in der Datei ( test.txtin 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 trueder 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:

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.

Verdammt .. du bist großartig .. nette Erklärung .. es entfernt #head und druckt alles. View: und Dinge unter Views..if / i "%% A" == "View:" (set import = false ) funktioniert nicht.. Mihir vor 8 Jahren 0
Sie wissen nicht, was Sie sagen sollen, es funktioniert hier auf Grundlage Ihrer Beispieldaten. Sind Sie sicher, dass die Zeile in Ihren tatsächlichen Daten tatsächlich nur "Ansicht:" ist und es keine zusätzlichen Leerzeichen oder irgendetwas gibt? Stimmt die Groß- und Kleinschreibung überein? Können Sie eine Kopie der eigentlichen Datendatei bereitstellen, für die Sie sie ausführen? Ƭᴇcʜιᴇ007 vor 8 Jahren 0
Tut mir leid, ich führe jede Anwendung aus, bei der die Ansicht "View: 3.2.43" ist. Mihir vor 8 Jahren 0
Ahh ok, ich werde eine modifizierte Version posten, die sich damit beschäftigt ... Ƭᴇcʜιᴇ007 vor 8 Jahren 0
Danke TECHIE007 für deine Hilfe und tolle Erklärung ... Mihir vor 8 Jahren 0
1
kingpin
@echo off for /F "usebackq tokens=1" %%A in ("devel.p4inc") do ( Set temp=False if "%%A" == "View:" Goto Exit if not "%%A" == "Import:" if not "%%A" == "Version:" echo %%A ) :Exit 
Könntest du das auch @kingpin erklären? Wenn Sie dies tun würden, wäre Ihre Antwort für zukünftige Besucher hilfreicher :) Sie können die Antwort [bearbeiten], um ein wenig Erklärung hinzuzufügen :) ᔕᖺᘎᕊ vor 8 Jahren 1
0
STTR

Befehlszeile:

powershell [string]$f=gc test.txt;$pL=$f.IndexOf('Import:')+7;$pR=$f.IndexOf('View:');$s=$f.Substring($pL,$pR-$pL);$s -split'#head'^|ac result.txt 

Power Shell:

powershell ./parsefl.ps1 

parsefl.ps1

[string]$f=gc test.txt; $pL=$f.IndexOf('Import:')+'Import:'.Length;$pR=$f.IndexOf('View:'); $s=$f.Substring($pL,$pR-$pL); $s -split'#head'|ac result.txt