Frage von JavaEsel, 24

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

Hallo ich habe eine Zeichenkette

set VARIABLE1 = Hallo Welt, heute ist ein ;schöner; Tag und die ;Sonne; scheint !

In der die 2 Wörter "schöner" und "Sonne" zwischen Semikolons stehen. Ich suche jetzt eine Möglichkeit, dass diese Wörter aus dem String herausgeschnitten werden und in anderen variablen gespeichert werden!

echo Das erste Wort ist %VARIABLE2%
echo Das zweite Wort ist %VARIABLE3%

Das erste Wort ist schöne
Das zweite Wort ist Sonne

Wichtig ist mir aber dass es eine Dynamische funktion ist.

Danke schonmal im vorraus für eure Hilfe MFG JavaEsel

Antwort
von S1r1us13, 11

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.

Kommentar von JavaEsel ,

Vielen Dank!

Antwort
von KekseFuerAlle, 4

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ß

Keine passende Antwort gefunden?

Fragen Sie die Community