Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: -heny-

-heny- (Level 1) - Jetzt verbinden

10.04.2008, aktualisiert 11.04.2008, 12779 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 ..
Ähnliche Inhalte
Outlook & Mail

EMails werden nach 3 Monaten entfern - Einstellung

Frage von staybbOutlook & Mail5 Kommentare

Hallo, ich habe bei einem Postfach das Problem, dass in Outlook alle Mails älter wie 3 Jahre verscheinden und ...

Neue Wissensbeiträge
Windows 10

Windows 10 kann XPS erzeugen aber nicht anzeigen ????

Erfahrungsbericht von Deepsys vor 4 StundenWindows 10

Heute schickt mir ein Kollegen eine E-Mail mit einer XPS-Datei vom Kunden im Anhang und fragt wie er diese ...

Exchange Server

1und1 IONOS: Probleme beim Mailversand mit Exchange

Information von reksierp vor 13 StundenExchange Server3 Kommentare

Hallo, seit Do, 17.1.19 etwa Mittags nimmt 1und1 IONOS keine Mails mehr über den Standard-Port SMTP 25 an. Nachdem ...

LAN, WAN, Wireless

Cisco Mikrotik VPN Standort Vernetzung mit dynamischem Routing

Anleitung von aqui vor 1 TagLAN, WAN, Wireless

1. Allgemeine Einleitung Das nachfolgende Tutorial ist eine Fortführung der hier bei Administrator.de schon bestehenden VPN Tutorials und beschreibt ...

Windows Mobile

Support für Windows Mobile endet im Dezember 2019

Information von transocean vor 2 TagenWindows Mobile

Moin, Microsoft empfiehlt als Alternative den Umstieg auf iOS oder Android, wie man hier lesen kann. Gruß Uwe

Heiß diskutierte Inhalte
LAN, WAN, Wireless
Temporäre WLAN Verbindung für AD-Login
Frage von Christian.WidauerLAN, WAN, Wireless17 Kommentare

Hallo zusammen, ich weiß leider nicht unter welchem Begriff ich dafür suchen muss, daher habe ich bisher leider nichts ...

Windows Server
MSSQL Backup in Form von .sql einspielen
Frage von janosch12Windows Server14 Kommentare

Guten Morgen, wir verwenden das Tool SQLandFTPBackup ( ) zum sichern einiger MSSQL Datenbanken. Nun sichert das Toll die ...

Netzwerkmanagement
Reverse Proxy für TCP und UDP Anfragen
gelöst Frage von flxklsNetzwerkmanagement14 Kommentare

Hallo zusammen, ich besitze einen Rootserver, der nur eine öffentliche IP besitzt und auf dem mehrere VMs laufen. Da ...

Microsoft Office
Office 2016 oder Office 2019
Frage von PeterzMicrosoft Office13 Kommentare

Hallo zusammen, wir müssen unser Office von 2010 auf eine neuere Version Umstellen. Jetzt stellt sich die Frage, ob ...