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“.
true
Ich bevorzuge es, die Variable speziell ( oder ) festzulegen false
. Setzen Sie sie false
zunächst auf , dann auf true
den 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 True
oder festgelegt ist, False
anstatt 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 „ false
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 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, true
prü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:
- Variablenerweiterung in FOR-Schleifen
- Wie teilt man eine Zeichenfolge in einer Windows-Batchdatei?
- Logische Operatoren („und“, „oder“) im DOS-Batch
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