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
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.
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>
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
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ß