-heny-
Goto Top

Sternchen (Asterisk) ersetzen

Hallo,

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

Content-Key: 85310

Url: https://administrator.de/contentid/85310

Printed on: April 19, 2024 at 22:04 o'clock

Member: SarekHL
SarekHL Apr 11, 2008 at 18:09:58 (UTC)
Goto Top
Wenn das Sternchen in String-Operationen ähnliche Bedeutung hat wie in Dateioperationen (Platzhalter für eine beliebige Zeichenkette), dann kann ich mir schon vorstellen, daß der Rechner ein Problem hat, eine solche Batch auszuführen ...
Member: bastla
bastla Apr 11, 2008 at 18:22:23 (UTC)
Goto Top
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:
for /f "tokens=1-10 delims=*" %%a in ("%string%") do set "string=%%a%%b%%c%%d%%e%%f%%g%%h%%i%%j"  
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:
@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
Alternative zu einem Teil der Alternative face-wink: 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:
@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
Member: -heny-
-heny- Apr 11, 2008 at 18:58:48 (UTC)
Goto Top
Hallo,

danke für die Mühe, allerdings ist mir das ein wenig zu umständlich. Ich schau mal, ob Biber mit einer einfacheren Lösung aufwarten kann. Falls dem nicht so ist, werde ich natürlich dankend auf deine Variante zurückgreifen.

Gruß,
heny
Member: Biber
Biber Apr 12, 2008 at 19:55:10 (UTC)
Goto Top
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
Member: -heny-
-heny- Apr 12, 2008 at 20:48:08 (UTC)
Goto Top
Hallo,

ok, trotzdem vielen Dank. VBScript kommt mir allerdings nicht in die Tüte, da ich das Skript plain weitergeben werde und der User nicht darauf angewiesen sein soll, VBScript lauffähig zu haben.

Gruß,
heny