Sternchen (Asterisk) ersetzen
Hallo,
gegeben sei folgender Codeschnipsel:
Warum stürzt das Batch-File ab, wenn ich versuchen will ein Sternchen in einem String zu ersetzen? Ich habe auch schon probiert das Sternchen zu maskieren, was mir allerdings auch keinen Erfolg gebracht hat.
Gruß,
heny
gegeben sei folgender Codeschnipsel:
@echo off
set "string=a*b"
set "string=%string:*=%"
echo %string%
pause
Warum stürzt das Batch-File ab, wenn ich versuchen will ein Sternchen in einem String zu ersetzen? Ich habe auch schon probiert das Sternchen zu maskieren, was mir allerdings auch keinen Erfolg gebracht hat.
Gruß,
heny
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 85310
Url: https://administrator.de/contentid/85310
Ausgedruckt am: 26.11.2024 um 10:11 Uhr
5 Kommentare
Neuester Kommentar
Hallo -heny-!
SarekHL liegt mit seiner Vermutung ziemlich richtig - die Erklärung findest Du in der Hilfe zu "set":
Wenn "str1" mit einem Sternchen beginnt, steht "str1" für alles zwischen dem Anfang der erweiterten Ausgabe bis zum ersten Auftreten des übrigen Abschnitts von "str1".
Biber hätte sicherlich eine bessere Lösung, aber als Workaround könntest Du es (nach dem Ersetzen aller anderen Sonderzeichen) so versuchen:
Solltst Du mehr als 9 Positionen mit "*" (unmittelbar aufeinanderfolgende Sterne werden nur einmal gezählt) erwarten, müsstest Du eben noch mehr Buchstaben des Alphabets bemühen ...
Alternative:
Alternative zu einem Teil der Alternative : Die Längenbestimmung kannst Du einsparen und für die Schleife eine maximale Zeichenanzahl vorgeben - für max 100 Zeichen sähe das dann so aus:
Grüße
bastla
SarekHL liegt mit seiner Vermutung ziemlich richtig - die Erklärung findest Du in der Hilfe zu "set":
Wenn "str1" mit einem Sternchen beginnt, steht "str1" für alles zwischen dem Anfang der erweiterten Ausgabe bis zum ersten Auftreten des übrigen Abschnitts von "str1".
Biber hätte sicherlich eine bessere Lösung, aber als Workaround könntest Du es (nach dem Ersetzen aller anderen Sonderzeichen) so versuchen:
for /f "tokens=1-10 delims=*" %%a in ("%string%") do set "string=%%a%%b%%c%%d%%e%%f%%g%%h%%i%%j"
Alternative:
@echo off & setlocal enabledelayedexpansion
set "string=a**b*c**d***e**f*g"
echo %string%
:: Länge des Strings über Temporärdatei bestimmen;
:: dann noch -1 (da Zählung in der Schleife ab 0)
echo %string%>%temp%\GetLen.tmp
for %%i in (%temp%\GetLen.tmp) do set /a Len=(%%~zi-2)-1
del %temp%\GetLen.tmp
set tempstring=
for /l %%i in (0,1,%Len%) do if "!string:~%%i,1!" neq "*" set "tempstring=!tempstring!!string:~%%i,1!"
set "string=%tempstring%"
echo %string%
pause
@echo off & setlocal enabledelayedexpansion
set "string=a**b*c**d***e**f*g"
echo %string%
set tempstring=
for /l %%i in (0,1,99) do if "!string:~%%i,1!" neq "*" set "tempstring=!tempstring!!string:~%%i,1!"
set "string=%tempstring%"
echo %string%
pause
Grüße
bastla
Moin -heny-,
eine grundsätzlich andere Strategie als bastla hätte auch nicht zu bieten im Batch - es geht IMHO nur über eine FOR /F-Anweisung mit "delims=*".
Die erste einzeilige Alternative oben wäre exakt auch meine Antwort gewesen.
Ich würde bestenfalls überlegen, diese Sonderzeichen-Eliminierung mit VBSkript und dem RegExp-Objekt anzugehen statt mit native Batch.
Grüße
Biber
eine grundsätzlich andere Strategie als bastla hätte auch nicht zu bieten im Batch - es geht IMHO nur über eine FOR /F-Anweisung mit "delims=*".
Die erste einzeilige Alternative oben wäre exakt auch meine Antwort gewesen.
Ich würde bestenfalls überlegen, diese Sonderzeichen-Eliminierung mit VBSkript und dem RegExp-Objekt anzugehen statt mit native Batch.
Grüße
Biber