(Sonder-)zeichen aus Variable entfernen
Hallo,
folgende Ausgangssituation ist gegeben:
Ich möchte nun aus obiger Variable bestimmte Zeichen entfernen (strippen). Dazu gehören auch Sonderzeichen. Bis jetzt habe ich es wie folgt probiert:
Das funktioniert soweit auch ohne Probleme. Kommen jetzt aber oben angesprochene Sonderzeichen (Steuerungszeichen) ins Spiel, wird es heikel.
Eine Beispieleingabe sei die Pipe "<". Gebe ich bei der Userabfrage dieses Zeichen ein, so crashed die Batch-Datei.
Logisch gedacht, folgendes probiert:
Bei einer Eingabe von "<" wird nun das Zeichen korrekt gestripped, auch innerhalb eines Strings wie "a<b" erhalte ich als Resultat "ab". Probleme tauchen auf, wenn ich nun z.B. "<>" eingebe.
Obiger Code müsste rein logisch gedacht auch funktionieren. Tippe ich nun "<>" ein, so crashed die Batch-Datei schon wieder. Interessanterweise stürzt die Batch-Datei auch bei der Eingabe von "<" ab (obigen Code vorausgesetzt), obwohl ich die Zeichenersetzung nur um das Sonderzeichen ">" ergänzt habe.
Genauso verhält es sich auch mit einigen anderen Sonderzeichen. Wie kann ich das Problem lösen?
Ich möchte aus einem beliebigen String u.a. folgende Zeichen strippen (in beliebiger Reihenfolge & Kombination):
<>&|:?"/\
Gruß,
heny
folgende Ausgangssituation ist gegeben:
set /p string=Geben Sie einen String ein:
echo %string%
Ich möchte nun aus obiger Variable bestimmte Zeichen entfernen (strippen). Dazu gehören auch Sonderzeichen. Bis jetzt habe ich es wie folgt probiert:
set /p string=Geben Sie einen String ein:
set string=%string:[=%
set string=%string:]=%
set string=%string:(=%
set string=%string:)=%
echo %string%
Das funktioniert soweit auch ohne Probleme. Kommen jetzt aber oben angesprochene Sonderzeichen (Steuerungszeichen) ins Spiel, wird es heikel.
Eine Beispieleingabe sei die Pipe "<". Gebe ich bei der Userabfrage dieses Zeichen ein, so crashed die Batch-Datei.
Logisch gedacht, folgendes probiert:
set /p string=Geben Sie einen String ein:
set string=%string:<=%
echo %string%
Bei einer Eingabe von "<" wird nun das Zeichen korrekt gestripped, auch innerhalb eines Strings wie "a<b" erhalte ich als Resultat "ab". Probleme tauchen auf, wenn ich nun z.B. "<>" eingebe.
set /p string=Geben Sie einen String ein:
set string=%string:<=%
set string=%string:>=%
echo %string%
Obiger Code müsste rein logisch gedacht auch funktionieren. Tippe ich nun "<>" ein, so crashed die Batch-Datei schon wieder. Interessanterweise stürzt die Batch-Datei auch bei der Eingabe von "<" ab (obigen Code vorausgesetzt), obwohl ich die Zeichenersetzung nur um das Sonderzeichen ">" ergänzt habe.
Genauso verhält es sich auch mit einigen anderen Sonderzeichen. Wie kann ich das Problem lösen?
Ich möchte aus einem beliebigen String u.a. folgende Zeichen strippen (in beliebiger Reihenfolge & Kombination):
<>&|:?"/\
Gruß,
heny
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 85139
Url: https://administrator.de/contentid/85139
Ausgedruckt am: 23.11.2024 um 03:11 Uhr
14 Kommentare
Neuester Kommentar
Hallo -heny-!
Da offensichtlich die (eingegebenen) Anführungszeichen stören, diese zuerst eliminieren:
Grüße
bastla
Da offensichtlich die (eingegebenen) Anführungszeichen stören, diese zuerst eliminieren:
@echo off
set /p "string=Geben Sie einen String ein: "
if defined string set "string=%string:"=%"
if defined string set "string=%string:<=%"
if defined string set "string=%string:>=%"
if defined string set "string=%string:&=%"
if defined string set "string=%string:|=%"
if defined string set "string=%string:^=%"
if defined string set "string=%string:?=%"
if defined string set "string=%string::=%"
if defined string set "string=%string:/=%"
if defined string set "string=%string:\=%"
if defined string (echo %string%) else (echo Keine verwertbare Eingabe!)
pause
Problematisch scheint hauptsächlich die alleinige Nutzung von Sonderzeichen zu sein
Wenn der String zwischendurch schon mal leer ist, nicht weiter daran herumdoktern ...Grüße
bastla
Hallo -heny-!
Grüße
bastla
Was genau meinst du damit?
Da es nicht sinnvoll sein kann, in einem eigentlich nicht mehr existenten String (da ursprünglich nur aus Sonderzeichen bestehend und früher oder später von all diesen bereits befreit) noch weitere Ersetzungen zu versuchen, sorgt "if defined string" dafür, dass nur, wenn noch Zeichen vorhanden sind, weiterhin ersetzt wird.Wenn ich nur Anführungsstriche eingebe, stürzt das Batch-File wieder ab.
Wie machst Du das? Mit meiner vorhin geposteten Version (wieder heruntergeladen und als "str.cmd" gespeichert) sieht das Ergebnis bei mir so aus:D:\>str
Geben Sie einen String ein: ""
Keine verwertbare Eingabe!
Drücken Sie eine beliebige Taste . . .
Grüße
bastla
Hallo -heny-!
Da ich mich an keine Situation erinnern kann, in der diese Schreibweise nachteilig gewesen wäre, verwende ich sie mittlerweile eigentlich standardmäßig (auch wenn es keinen besonderen Anlass dafür gibt).
In der ersten Batchzeile solltest Du noch ein "& setlocal" ergänzen, damit die nachfolgend erstellte(n) Variable(n) nur für den aktuellen Batch gelten und nachher keine Reste mehr davon herumliegen.
Grüße
bastla
Da habe ich dein Script nicht genau angeschaut.
Passiert mir öfter, dass ich mein Script nicht genau (genug) anschaue ... Fallen dir noch weitere problematische Sonderzeichen ein?
Auf Anhieb nicht (wobei sich die Frage stellt, in welchem Zusammenhang die Probleme entstehen könnten).Und was genau bewirken die Anführungsstriche vor und nach dem string=%string^=%?
Ist ein Biber-Special: Damit kannst Du einerseits zB auch Leerzeichen in eine Variable schreiben, andererseits weist Du damit im Prinzip den Interpreter an, (bis auf die Variablenzuweisung) den Teil dazwischen eben nicht zu interpretieren, sondern einfach als Text zu behandeln.Da ich mich an keine Situation erinnern kann, in der diese Schreibweise nachteilig gewesen wäre, verwende ich sie mittlerweile eigentlich standardmäßig (auch wenn es keinen besonderen Anlass dafür gibt).
In der ersten Batchzeile solltest Du noch ein "& setlocal" ergänzen, damit die nachfolgend erstellte(n) Variable(n) nur für den aktuellen Batch gelten und nachher keine Reste mehr davon herumliegen.
Grüße
bastla
Hallo -heny-!
Du könntest als Workaround den Variableninhalt anfangs in die Variable "string" schreiben, den obigen Code als Unterprogramm verwenden, und dann erst die Zuweisung an die benötigte Variable vornehmen.
Vorweg stellt sich allerdings die Frage, woher eigentlich derartig verquere Strings überhaupt kommen sollen - den Fall "direkte Benutzereingabe" hast Du schon abgedeckt, und für das Auslesen aus einer Datei (oder die Verarbeitung der Ausgabe eines Programmes) sollte es auch mit der beschriebenen Methode klappen.
Als Beispiel eine Datei "Test.txt" mit folgendem Inhalt:
Der Batch dazu:
Natürlich ist dieser Lösungsweg nicht so elegant wie Deine "Function", aber mir fällt momentan kein Weg ein, wie sowohl die nötigen Anführungszeichen (außen herum) gesetzt werden können, als auch die Auflösung der Variablen innerhalb dieser Anführungszeichen (nach dem "=") erfolgen soll - vielleicht hat ja Biber noch eine Idee dazu ...
Grüße
bastla
Du könntest als Workaround den Variableninhalt anfangs in die Variable "string" schreiben, den obigen Code als Unterprogramm verwenden, und dann erst die Zuweisung an die benötigte Variable vornehmen.
Vorweg stellt sich allerdings die Frage, woher eigentlich derartig verquere Strings überhaupt kommen sollen - den Fall "direkte Benutzereingabe" hast Du schon abgedeckt, und für das Auslesen aus einer Datei (oder die Verarbeitung der Ausgabe eines Programmes) sollte es auch mit der beschriebenen Methode klappen.
Als Beispiel eine Datei "Test.txt" mit folgendem Inhalt:
(Hoffentlich) kein '#+*~ ^Problem.
"<>Dies&ist|ein||&Test""""
Noch einige besondere §$%&/()=? Zeichen
@echo off & setlocal enabledelayedexpansion
set /a Nr=1
for /f "delims=" %%i in (Test.txt) do set "string=%%i" & call :ProcessLine
echo\
echo Nach der Schleife vorhandene Variable:
set Test
goto :eof
:ProcessLine
call :StripCharacters
set "Test%Nr%=%string%"
echo !Test%Nr%!
set /a Nr+=1
goto :eof
:StripCharacters
if defined string set "string=%string:"=%"
if defined string set "string=%string:<=%"
if defined string set "string=%string:>=%"
if defined string set "string=%string:&=%"
if defined string set "string=%string:|=%"
if defined string set "string=%string:^=%"
if defined string set "string=%string:?=%"
if defined string set "string=%string::=%"
if defined string set "string=%string:/=%"
if defined string set "string=%string:\=%"
if defined string set "string=%string:(=%"
if defined string set "string=%string:)=%"
goto :eof
Natürlich ist dieser Lösungsweg nicht so elegant wie Deine "Function", aber mir fällt momentan kein Weg ein, wie sowohl die nötigen Anführungszeichen (außen herum) gesetzt werden können, als auch die Auflösung der Variablen innerhalb dieser Anführungszeichen (nach dem "=") erfolgen soll - vielleicht hat ja Biber noch eine Idee dazu ...
Grüße
bastla
Hallo -heny-!
Fällt Dir auf, dass ich ebenfalls ein Unterprogramm verwendet habe (und dieses daher auch so oft wie nötig aufrufen kann)?
Der Unterschied besteht eigentlich nur darin, dass vor dem Aufruf der zu bereinigende Text in die Variable "string" zu schreiben ist und sich auch danach noch dort befindet - daher die Eingabe gleich in "string" speichern (wie oben schon durchgespielt) und erst nach dem Unterprogrammaufruf das Ergebnis der gewünschten Variablen zuweisen, also etwa:
Grüße
bastla
Fällt Dir auf, dass ich ebenfalls ein Unterprogramm verwendet habe (und dieses daher auch so oft wie nötig aufrufen kann)?
Der Unterschied besteht eigentlich nur darin, dass vor dem Aufruf der zu bereinigende Text in die Variable "string" zu schreiben ist und sich auch danach noch dort befindet - daher die Eingabe gleich in "string" speichern (wie oben schon durchgespielt) und erst nach dem Unterprogrammaufruf das Ergebnis der gewünschten Variablen zuweisen, also etwa:
@echo off & setlocal
set /p "string=Geben Sie einen String ein: "
call :StripCharacters
set "Eingabe=%string%"
...
...
Grüße
bastla