Zeichenfolge mit Batch-Skript analysieren

Zeichenfolge mit Batch-Skript analysieren

Wie kann ich Zeichenfolgen mit einem Batch-Skript analysieren?

Ziel ist, alles darunter in einem Array zu speichern und beispielsweise --> und Import:zu entfernen .#head//MPackages/Project/config/abc.txt//Packages/Project/config/cde.txt

Datei 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 Importieren:

Antwort1

Eines der Hauptprobleme in Ihrer Logik ist, dass Sie die Variable „import“ einmal festlegen, wenn etwas wahr ist, sie aber nie zurücksetzen oder aufheben, wenn es nicht mehr wahr ist. Nachdem sie also zum ersten Mal festgelegt wurde, bleibt sie für den Rest der Schleife „definiert“.

trueIch bevorzuge es, die Variable speziell ( oder ) festzulegen false. Setzen Sie sie falsezunächst auf , dann auf trueden gewünschten Wert, aber stellen Sie dann auch sicher, dass Sie sie bei Bedarf wieder auf zurücksetzen false. Überprüfen Sie dann bei jeder Iteration der Schleife, ob die Variable speziell auf Trueoder festgelegt ist, Falseanstatt zu prüfen, ob sie nur 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 (Flag) „Import“ bewusst auf „ falseStart“.

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 Variable entfernen, damit es in der For-Schleife funktioniert).

Das erste IF prüft, ob die aktuelle Zeile die Zeile „Import:“ ist, und setzt in diesem Fall das Flag „Import“ auf true.

Das nächste IF prüft, ob die aktuelle Zeile die Zeile „Ansicht:“ ist. Wenn dies der Fall ist, setzt es das Flag „Importieren“ (zurück auf) auf false, sodass die Verarbeitung der einzelnen Zeilen gestoppt wird.

Das dritte IF prüft, ob das „Import“-Flag gesetzt ist true, und verarbeitet die Zeile, wenn dies der Fall ist.

Wenn dies der Fall ist, trueprüft das verschachtelte (4.) IF, ob es sich bei der Zeile um die tatsächliche „Import:“-Zeile handelt. Wenn nicht, wird die Zeile angezeigt (verhindert, dass die „Import:“-Zeile in der Ausgabe angezeigt wird).

Die zweite For-Schleife durchläuft die Zeile, die angezeigt werden soll, und zieht nur den ersten Token-Satz, der (nur) der gewünschte Pfad ist, und lässt das weg #head.

Weitere/verwandte Informationen:

Nach Kommentaren bearbeiten:

Um mit der Zeile „View:“ umzugehen, wenn dahinter eine Versionsnummer steht, können Sie den Code etwa wie folgt ä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 sich um „View:“ oder „Import:“ handelt, anstatt die gesamte Zeile zu prüfen. Dabei wird effektiv alles nach dem ersten Leerzeichen, das in der Zeile gefunden wird, ignoriert, um die Prüfung durchzuführen.

Antwort2

@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

Antwort3

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

verwandte Informationen