Wie kann man in Batch eine Zeichenkette, welche zwischen 2 sonderzeichen steht aus einer Variable extrahiern?

2 Antworten

Wenn sicher ist, dass immer nur zwei Wörter gesucht werden, geht:

FOR /F "tokens=2,4 delims=;" %%A IN ("%VARIABLE1 %") DO (
  set VARIABLE2=%%A
  set VARIABLE3=%%B
)

Wenn es auch mehr oder weniger als zwei Wörter sein können, würde ich über den SHIFT-Befehl gehen:

Setlocal EnableDelayedExpansion
set WordNo=1
set VARIABLE1 =%VARIABLE1 :"={%
set VARIABLE1 =%VARIABLE1 :;="%

call :Function_ExtractEnclosed %VARIABLE1 %
FOR /L %%A IN (2,1,!WordNo!) DO set VARIABLE%%A=!Variable%%A:{="!
set VARIABLE1 =%VARIABLE1 :"=;%
set VARIABLE1 =%VARIABLE1 :{="%

[...]

exit

:Function_ExtractEnclosed
  if %1 == "%~1" (
    set /a WordNo+=1
    set VARIABLE!WordNo!=%~1
  )
  shift /1
  if "%~1" == "" exit /b
goto Function_ExtractEnclosed

Dieser Code ersetzt zuerst alle Anführungszeichen in VARIABLE1 mit { und dann alle Semikolon mit Anführungszeichen. Das ist wichtig, damit der SHIFT-Befehl korrekt arbeitet. Dabei hilft das { nur, dass die neuen Anführungszeichen mit den alten nicht in Konflikt geraten. Der ursprüngliche Wert wird später wiederhergestellt.

Anschließend ruft der Code eine Funktion auf (CALL-Befehl) mit VARIABLE1 als Parameter.

Die Funktion prüft, ob der nächste Parameter von Anführungszeichen umschlossen ist. Ist das der Fall, handelt es sich um ein gesuchtes Wort. Dann wird es in der nächsten Variable abgespeichert.

Sind alle Parameter abgearbeitet, beendet sich die Funktion (EXIT /B).

Anschließend werden in sämtlichen Variablen die Anführungszeichen wiederhergestellt.

Ein Tipp übrigens: Benutz in den Namen von Variablen keine Leerzeichen. Das kann zu Verwirrung führen.

JavaEsel 
Fragesteller
 29.05.2016, 18:11

Vielen Dank!

0
Raptor012  31.07.2022, 16:04

Vielen Dank für diesen Beispielcode und die Erklärung!

Mir hat es sehr dabei geholfen, "tokens" und "delims" zu verstehen. Und vor allem, der Tipp, dass ich auch Variablen manipulieren und dann direkt in der for-Schleife auslesen kann.

Das hat mir heute den Tag gerettet :D

0
Raptor012  31.07.2022, 16:26

Vielen Dank für diesen Beispielcode und die Erklärung!

Falls jemandem mein daraus entstandener Code-Teil hilft, hier noch ein Beispiel meiner Nutzung:

CDM Dokument .cmd oder .bat

::In einem HTML Dokument eine bestimmte Stelle finden und diese in ein TXT-Dokument schreiben (in dem Fall die Seitenanzahl).
    findstr /L "Pages:" "index.html" >"temp.txt"

::Lade den entstandenen Inhalt in eine Variable "temp"
    set /p temp=<"temp.txt"

::Entferne irrelevante oder CMD-behindernde Sonderzeichen (Freie Auswahl welche) (| sollte aber auf jedenfall sein, da es in CMD beim kommenden auslesen sonst einen Absturz verursacht)
    set "temp=%temp:|=%"
    set "temp=%temp:<=%"
    set "temp=%temp:>=%"
    set "temp=%temp:&=%"
    set "temp=%temp:^=%"
    set "temp=%temp:?=%"
    set "temp=%temp:\=%"
    set "temp=%temp:!=%"
    set "temp=%temp:?=%"
    set "temp=%temp: =%"
    set "temp=%temp:	=%"

::Nach diesen Zeichen soll gleich gesucht werden, deshalb ändere ich sie alle in ein einheitliches Zeichen ":/ wird zu ;
    set temp=%temp:"=;%
    set temp=%temp::=;%
    set temp=%temp:/=;%

::Schreibe den abgeänderten Inhalt wieder in die temp.txt
            echo %temp%>"temp.txt"

Suche nun nach dem 4. String zwischen zwei ; und schreibe sie in die Variable pages_output
    FOR /F "usebackq tokens=4 delims=;" %%A IN ("temp.txt") DO set pages_output=%%A
        

::Gebe den Inhalt von pages_output in der Console aus.
    echo. && echo Seiten: "%pages_output%" * && echo.

::lösche zum schluss die temp.txt
    DEL "temp.txt"

Hier noch ein kleiner Auszug aus einem der HTML-Dokumente zum Nachtesten

<li><span class='tags_text'>Artists:</span> <a class='tag  btn btn-primary' href='/artist/test1/'>test2 <span class='badge'>6</span></a></li>
				
				<li><span class='tags_text'>Languages:</span> <a class='tag  btn btn-primary' href='/language/english/'>english <span class='badge'>1</span></a></li>
				<li><span class='tags_text'>Category:</span> <a class='tag btn btn-primary western' href='/category/test3/'>test4 <span class='badge'>2</span></a></li>
		 		<li class="pages">Pages: 12</li>
0

Tachchen,
ich habe ein ähnliches Problem, wie in diesem Beitrag:

Eventuell kann mir jemand hierrauf aufbauend weiterhelfen.

Ich habe einen Satz, der in einer Variable abgespeichert ist. Dieser Text enthält zwei Zeichenfolgen und den Text zwischen diesen Zeichenfolgen will ich löschen lassen.
Desweiteren ist die Zeichenfolge jedesmal mit 1-2 Zeichen anders (die aber immer an der selben stelle stehen). Also muss man wahrscheinlich mit Wildcards arbeiten, z.b. Fragezeichen. Lässt sich das mit Batch machen, oder muss man das mit Powershell machen? Wie würde das in Batch / Powershell aussehen?

Zum Beipiel:

Protokoll.T01.beliebigerzulöschenderText-Autor

Protokoll.T02.beliebigerzulöschenderText-Autor

etc ...


Ich hoffe da kann mir jemand weiterhelfen.

Gruß