Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

(Sonder-)zeichen aus Variable entfernen

Frage Entwicklung Batch & Shell

Mitglied: -heny-

-heny- (Level 1) - Jetzt verbinden

10.04.2008, aktualisiert 11.04.2008, 11049 Aufrufe, 14 Kommentare

Hallo,

folgende Ausgangssituation ist gegeben:

01.
set /p string=Geben Sie einen String ein:  
02.
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:

01.
set /p string=Geben Sie einen String ein:  
02.
set string=%string:[=% 
03.
set string=%string:]=% 
04.
set string=%string:(=% 
05.
set string=%string:)=% 
06.
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:

01.
set /p string=Geben Sie einen String ein:  
02.
set string=%string:<=% 
03.
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.

01.
set /p string=Geben Sie einen String ein:  
02.
set string=%string:<=% 
03.
set string=%string:>=% 
04.
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
Mitglied: bastla
10.04.2008 um 15:12 Uhr
Hallo -heny-!

Versuch's mal so:
01.
set /p "string=Geben Sie einen String ein: " 
02.
set "string=%string:<=%" 
03.
set "string=%string:>=%" 
04.
echo %string%
Grüße
bastla
Bitte warten ..
Mitglied: -heny-
10.04.2008 um 15:43 Uhr
Hallo,

das funktioniert schon mal etwas besser.

Jetzt habe ich folgenden Code:

01.
@echo off 
02.
set /p "string=Geben Sie einen String ein: " 
03.
set "string=%string:<=%" 
04.
set "string=%string:>=%" 
05.
set "string=%string:&=%" 
06.
set "string=%string:|=%" 
07.
set "string=%string:^=%" 
08.
set "string=%string:"=%" 
09.
set "string=%string:?=%" 
10.
set "string=%string::=%" 
11.
set "string=%string:/=%" 
12.
set "string=%string:\=%" 
13.
echo %string% 
14.
pause
Problemlos geht jetzt z.B. die Eingabe von "<>", ">" oder "a<>b".

Bei manchen Eingaben ist das Verhalten dennoch noch etwas komisch, ich liste mal ein paar auf:

Eingabe: "<"
Output:
01.
KEINER, Crash
Eingabe: "|"
Output:
01.
Geben Sie einen String ein: | 
02.
03.
Drücken Sie eine beliebige Taste . . .
Eingabe: "&"
Output:
01.
KEINER, Crash
Eingabe: "||"
Output:
01.
Geben Sie einen String ein: || 
02.
03.
Drücken Sie eine beliebige Taste . . .
Eingabe: "|&|"
Output:
01.
Geben Sie einen String ein: |&| 
02.
03.
Drücken Sie eine beliebige Taste . . .
Eingabe: "^^"
Output:
01.
Geben Sie einen String ein: ^^ 
02.
"= 
03.
Drücken Sie eine beliebige Taste . . .
Komplexere Eingaben hingegen funktionieren meist ohne Probleme. Problematisch scheint hauptsächlich die alleinige Nutzung von Sonderzeichen zu sein, ohne andere Zeichen (z.B. numerische).

Hier ein Beispiel, das problemlos funktioniert:

Eingabe: "<>Dies&ist|ein||&Test""""
Output:
01.
Geben Sie einen String ein: <>Dies&ist|ein||&Test""" 
02.
DiesisteinTest 
03.
Drücken Sie eine beliebige Taste . . .
Ich bin ziemlich verwirrt. :/

Gruß,
heny
Bitte warten ..
Mitglied: bastla
10.04.2008 um 15:57 Uhr
Hallo -heny-!

Da offensichtlich die (eingegebenen) Anführungszeichen stören, diese zuerst eliminieren:
01.
@echo off 
02.
set /p "string=Geben Sie einen String ein: " 
03.
if defined string set "string=%string:"=%" 
04.
if defined string set "string=%string:<=%" 
05.
if defined string set "string=%string:>=%" 
06.
if defined string set "string=%string:&=%" 
07.
if defined string set "string=%string:|=%" 
08.
if defined string set "string=%string:^=%" 
09.
if defined string set "string=%string:?=%" 
10.
if defined string set "string=%string::=%" 
11.
if defined string set "string=%string:/=%" 
12.
if defined string set "string=%string:\=%" 
13.
if defined string (echo %string%) else (echo Keine verwertbare Eingabe!) 
14.
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
Bitte warten ..
Mitglied: -heny-
10.04.2008 um 16:01 Uhr
Hallo,

die Versetzung der "-Eliminierung an die oberste Stelle behebt das Problem nicht. Wenn ich nur Anführungsstriche eingebe, stürzt das Batch-File wieder ab.

Wenn der String zwischendurch schon mal leer
ist, nicht weiter daran herumdoktern ...

Was genau meinst du damit? Daraus werde ich nicht ganz schlau.

Gruß,
heny
Bitte warten ..
Mitglied: bastla
10.04.2008 um 16:39 Uhr
Hallo -heny-!

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:
01.
D:\>str 
02.
Geben Sie einen String ein: "" 
03.
Keine verwertbare Eingabe! 
04.
Drücken Sie eine beliebige Taste . . .
Grüße
bastla
Bitte warten ..
Mitglied: -heny-
10.04.2008 um 16:51 Uhr
Hallo,

ups, sorry. Da habe ich dein Script nicht genau angeschaut. Wobei ich darauf, dass man eine nicht vorhandene Variable nicht weiter bearbeiten kann, auch hätte selber kommen können. ;)
Naja, hinterher ist man immer schlauer.

Das funktioniert soweit top, nur fehlen anscheinend noch ein paar Zeichen, die Probleme verursachen können. Unter anderem musste ich noch ")" herausstrippen, da das Batch-File sonst ebenfalls crashed.

Im folgenden der bisherige Code:

01.
@echo off 
02.
:start 
03.
set /p "string=Geben Sie einen String ein: " 
04.
if defined string set "string=%string:"=%" 
05.
if defined string set "string=%string:<=%" 
06.
if defined string set "string=%string:>=%" 
07.
if defined string set "string=%string:&=%" 
08.
if defined string set "string=%string:|=%" 
09.
if defined string set "string=%string:^=%" 
10.
if defined string set "string=%string:?=%" 
11.
if defined string set "string=%string::=%" 
12.
if defined string set "string=%string:/=%" 
13.
if defined string set "string=%string:\=%" 
14.
if defined string set "string=%string:)=%" 
15.
if defined string (echo %string%) else (echo Keine verwertbare  
16.
 
17.
Eingabe!) 
18.
goto :start
Fallen dir noch weitere problematische Sonderzeichen ein?
Und was genau bewirken die Anführungsstriche vor und nach dem string=%string^=%?

Gruß,
heny
Bitte warten ..
Mitglied: bastla
10.04.2008 um 17:06 Uhr
Hallo -heny-!

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
Bitte warten ..
Mitglied: -heny-
10.04.2008 um 17:11 Uhr
Hallo,

Reicht da folgendes, was ich eh schon im Script stehen habe?

01.
(...) 
02.
    if NOT "%cmdextversion%"=="2" goto wrongcmdext 
03.
    setlocal EnableDelayedExpansion 
04.
(...)
Gruß,
heny
Bitte warten ..
Mitglied: bastla
10.04.2008 um 17:18 Uhr
Hallo -heny-!

Reicht; "DelayedExpansion" verwende ich übrigens nur, wenn's gar nicht anders geht (wird aber vermutlich bei Deinem Batch der Fall sein).

Grüße
bastla
Bitte warten ..
Mitglied: -heny-
10.04.2008 um 17:40 Uhr
Hallo,

ok. Noch eine andere kleine Problematik:

ich habe einen Aufruf irgendwo im Script

01.
call :stripcharacters VariablenName
Die Funktion :stripcharacters entfernt alle Sonderzeichen aus einem String, der in einer Variable gespeichert ist.

Der Inhalt der Funktion ist wie folgt:

01.
    :stripcharacters 
02.
    if defined %* set "%*=%%*%:"=%" 
03.
    if defined %* set "%*=%%*%:<=%" 
04.
    if defined %* set "%*=%%*%:>=%" 
05.
    if defined %* set "%*=%%*%:&=%" 
06.
    if defined %* set "%*=%%*%:|=%" 
07.
    if defined %* set "%*=%%*%:^=%" 
08.
    if defined %* set "%*=%%*%:?=%" 
09.
    if defined %* set "%*=%%*%:=%" 
10.
    if defined %* set "%*=%%*%:/=%" 
11.
    if defined %* set "%*=%%*%:\=%" 
12.
    if defined %* set "%*=%%*%:)=%" 
13.
    goto :eof
Die Funktion soll den durch den "call"-Befehl übergebenen Variablennamen (ohne %%) nutzen und entsprechend die Sonderzeichen aus der Variable strippen. Es hängt allerdings an einer Stelle im "set"-Befehl. Es werden keine Sonderzeichen aus der Variable entfernt.

Baue ich ein "echo" ein, um zu sehen woran es hängt

01.
echo if defined %* set "%*=%%*%:"=%"
erhalte ich folgenden "echo"-Output:

01.
if defined VariablenName set "VariablenName=%*:"="
Korrekt müsste der Output wie folgt lauten:

01.
if defined VariablenName set "VariablenName=%VariablenName:"=%"
Wie kann ich bewerkstelligen, das der übergebene Parameter (der Variablenname) auch korrekt eingesetzt wird, damit die Sonderzeichen-Entfernung problemlos funktioniert?

Gruß,
heny
Bitte warten ..
Mitglied: bastla
10.04.2008 um 18:48 Uhr
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:
01.
(Hoffentlich) kein '#+*~ ^Problem. 
02.
"<>Dies&ist|ein||&Test"""" 
03.
Noch einige besondere §$%&/()=? Zeichen
Der Batch dazu:
01.
@echo off & setlocal enabledelayedexpansion 
02.
set /a Nr=1 
03.
for /f "delims=" %%i in (Test.txt) do set "string=%%i" & call :ProcessLine 
04.
echo\ 
05.
echo Nach der Schleife vorhandene Variable: 
06.
set Test 
07.
goto :eof 
08.
 
09.
:ProcessLine 
10.
call :StripCharacters 
11.
set "Test%Nr%=%string%" 
12.
echo !Test%Nr%! 
13.
set /a Nr+=1 
14.
goto :eof 
15.
 
16.
:StripCharacters 
17.
if defined string set "string=%string:"=%" 
18.
if defined string set "string=%string:<=%" 
19.
if defined string set "string=%string:>=%" 
20.
if defined string set "string=%string:&=%" 
21.
if defined string set "string=%string:|=%" 
22.
if defined string set "string=%string:^=%" 
23.
if defined string set "string=%string:?=%" 
24.
if defined string set "string=%string::=%" 
25.
if defined string set "string=%string:/=%" 
26.
if defined string set "string=%string:\=%" 
27.
if defined string set "string=%string:(=%" 
28.
if defined string set "string=%string:)=%" 
29.
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
Bitte warten ..
Mitglied: -heny-
10.04.2008 um 21:28 Uhr
Hallo,

hm, ich glaube wir haben da aneinander vorbei geredet. Die Variable, welche beim Aufruf durch "call" übergeben wird hat ihren Inhalt aus einer Benutzereingabe. Ich möchte die gesamten "if defined ..." Befehle in der Batch-Datei jeweils durch den Aufruf der Prozedur ersetzen, da ich mir dann etliche Zeilen unnötigen Code spare.

Gruß,
heny
Bitte warten ..
Mitglied: bastla
10.04.2008 um 21:49 Uhr
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:

01.
@echo off & setlocal 
02.
set /p "string=Geben Sie einen String ein: " 
03.
call :StripCharacters 
04.
set "Eingabe=%string%" 
05.
... 
06.
...
Grüße
bastla
Bitte warten ..
Mitglied: -heny-
11.04.2008 um 18:04 Uhr
Hallo,

ich habe das ganze entsprechend deiner Hilfe jetzt wie folgt gelöst:

01.
     call :stripcharacters enemyname 
02.
     if "%flagblank%"=="1" goto mainmenu 
03.
     if "%flagspecialchar%"=="1" goto mainmenu 
04.
 
05.
    :stripcharacters 
06.
    if NOT "!%*!"=="" ( 
07.
        set flagblank=0 
08.
        set flagspecialchar=0 
09.
        set stripstring=!%*! 
10.
        if defined stripstring set "stripstring=!stripstring:"=!" 
11.
        if defined stripstring set "stripstring=!stripstring:<=!" 
12.
        if defined stripstring set "stripstring=!stripstring:>=!" 
13.
        if defined stripstring set "stripstring=!stripstring:&=!" 
14.
        if defined stripstring set "stripstring=!stripstring:|=!" 
15.
        if defined stripstring set "stripstring=!stripstring:^=!" 
16.
        if defined stripstring set "stripstring=!stripstring:?=!" 
17.
        if defined stripstring set "stripstring=!stripstring:/=!" 
18.
        if defined stripstring set "stripstring=!stripstring:(=!" 
19.
        if defined stripstring set "stripstring=!stripstring:)=!" 
20.
        if defined stripstring ( 
21.
            set %*=!stripstring! 
22.
        ) else ( 
23.
            set flagspecialchar=1 
24.
            echo. 
25.
            echo !%lang%specialcharinput! 
26.
            echo. 
27.
            if "%sbreaks%"=="1" pause 
28.
29.
    ) else ( 
30.
        set flagblank=1 
31.
        echo. 
32.
        echo !%lang%blankinput! 
33.
        echo. 
34.
        if "%sbreaks%"=="1" pause 
35.
36.
    goto :eof
Da steckt noch einiges an Code drin, der ohne den Rest des Batch-Files unverständlich ist, aber zumindest funktioniert es jetzt so wie ich möchte. Vielleicht hilft das ja irgendjemandem, deswegen habe ich den Code noch mal geposted.

Danke noch mal!

Gruß,
heny
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst In Batch variable DOS-Funktion von "größer" und "kleiner" Zeichen unterdrücken (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Variable auf 5 Zeichen begrenzen (5)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Batch & Shell
gelöst Selected Gridview Value in Variable schreiben (4)

Frage von reissaus73 zum Thema Batch & Shell ...

Batch & Shell
gelöst Appx aus Image auslesen und entfernen (9)

Frage von Markus2016 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...