
94451
13.10.2010, aktualisiert um 22:19:12 Uhr
Zeichen in variable ersetzen
Hallo ihr,
ich möchte gerne einen kasten aus sternen schaffen in diesen kasten sind variablen und ich weiß nie wie lange ein wort ist,...
der kasten soll 50 zeichen breit sein,... d.h. [stern][leer]%variable%zeichen bis 49[stern]
jetzt hab ich mir gedacht das ich hinter die variable ne variable schreibe mit 49 leer stellen und dann ersetze ich stelle x mit einem stern (stelle x ergibt sich aus 49- der zeichenlänge der variable)
die fragen sind jetzt
1. wie zähle ich wie lang meine variable ist?
2. wie rechne ich in batch
3. wie ersetze ich ein bestimmtes zeichen (wobei bestimmt unbestimmt ist, also eine variable
*musste sein der satz*)
Danke
Grüßle
ich möchte gerne einen kasten aus sternen schaffen in diesen kasten sind variablen und ich weiß nie wie lange ein wort ist,...
ECHO *************************************************
ECHO * %variable1% *
ECHO * %variable2% *
ECHO * %variable3% *
ECHO * %variable4% *
ECHO *************************************************
der kasten soll 50 zeichen breit sein,... d.h. [stern][leer]%variable%zeichen bis 49[stern]
jetzt hab ich mir gedacht das ich hinter die variable ne variable schreibe mit 49 leer stellen und dann ersetze ich stelle x mit einem stern (stelle x ergibt sich aus 49- der zeichenlänge der variable)
die fragen sind jetzt
1. wie zähle ich wie lang meine variable ist?
2. wie rechne ich in batch
3. wie ersetze ich ein bestimmtes zeichen (wobei bestimmt unbestimmt ist, also eine variable
Danke
Grüßle
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 152984
Url: https://administrator.de/forum/zeichen-in-variable-ersetzen-152984.html
Ausgedruckt am: 04.05.2025 um 09:05 Uhr
5 Kommentare
Neuester Kommentar
Hallo Roadrunner777!
Ist jetzt etwas umfangreicher geworden
- die Kurzfassung wäre:
Kurze Erklärung zum oberen Ansatz:
Die Zeilen 1 bis 11 erzeugen, ausgehend von der gewählten Länge in Zeile 2, die Variablen %leer% mit %len% Leerzeichen und die Variable %stern% mit %len% + 4 Sternen (+ 4 für das jeweiligen Rahmenzeichen an Anfang und Ende der Zeile sowie die zusätzlichen Leerzeichen als Trennung von der eigentlichen Zeile). Die Verwendung von "delayedExpansion" in einem begrenzten Bereich des Batches erlaubt es, die Variablen in der Schleife ohne Verwendung eines Unterprogrammes zu befüllen und trotzdem noch unfallfrei Text mit enthaltenen "!" verwenden zu können.
Die "::DATA"-Zeilen sind für Batch Kommentar (Du könntest auch "REM DATA" verwenden) und werden daher im Ablauf ignoriert, können jedoch in weiterer Folge aus der Batchdatei ausgelesen werden - analog zu den "DATA"-Zeilen in (Uralt-)BASIC.
Dieses Auslesen erfolgt in der Schleife unter Verwendung von "
In diesem Unterprogramm wird der Zeile zunächst die erforderliche Anzahl an Leerzeichen hinzugefügt und danach die Zeile auf die vorgegeben Anzahl von Zeichen gekürzt - durch die Verwendung des "
Schließlich wird noch die Zeile samt Rahmenzeichen ausgegeben.
Das Unterprogramm ist so ausgelegt, dass es genauso mit
aufgerufen werden könnte.
Zu beachten wäre, dass bestimmte Sonderzeichen (<|>^&) mit besonderer Bedeutung in einem Batch "maskiert" werden müssten, da die Ausgabe der Zeile ohne umschließende Anfürungszeichen erfolgt - die Maskierung könnte (für jedes Zeichen einzeln) etwa so erfolgen:
Nachteil dabei: Es wird die Zeilenlänge "verfälscht", da "^&" als einzelnes Zeichen "&" ausgegeben wird - daher die angeführten Zeichen nach Möglichkeit vermeiden ...
Noch zu Deinen Fragen:
Zu 1: Aufwändige Variante:
Hier wird einfach von vorne weg jeweils ein Zeichen weggelassen, bis keines mehr übrig (und daher die Variable %vartemp% nicht mehr "defined") ist.
Biber-Special:
Die -4 Zeichen ergeben sich aus den mit in die Temp-Datei geschriebenen beiden Anführungszeichen (zur Sicherheit wegen der schon angesprochenen Sonderzeichen) und dem Zeilenende (CR + LF) - und falls Du "%%~zi" suchst:
(ziemlich am Ende)
Zu 2. und 3.:
Grüße
bastla
jetzt hab ich mir gedacht das ich hinter die variable ne variable schreibe mit 49 leer stellen und dann ersetze ich stelle x mit einem stern (stelle x ergibt sich aus 49- der zeichenlänge der variable)
Vom Ansatz her schon ganz ok, aber Du musst gar nicht die Länge Deiner Variablen bestimmen (sondern nur die Gesamtlänge vorgeben):@echo off & setlocal
set /a len=46
set "leer="
set "stern="
setlocal enabledelayedexpansion
for /L %%i in (1,1,%len%) do (
set "leer=!leer! "
set "stern=!stern!*"
)
set "stern=**%stern%**"
setlocal disabledelayedexpansion
::DATA Ueberschrift
::DATA
::DATA Kurze Zeile
::DATA Wirklich gaaaaaaaanz laaaaaaaaange Zeile!
::DATA Fertig
echo %stern%
for /f "tokens=1*" %%i in ('findstr /b "::DATA" "%0"') do call :WriteFormattedLine "%%j"
echo %stern%
goto :eof
:WriteFormattedLine
set "zeile=%~1%leer%"
call set "zeile=%%zeile:~0,%len%%%"
echo * %zeile% *
goto :eof
set "zeile=%variable1% "
echo * %zeile:~,46% *
Die Zeilen 1 bis 11 erzeugen, ausgehend von der gewählten Länge in Zeile 2, die Variablen %leer% mit %len% Leerzeichen und die Variable %stern% mit %len% + 4 Sternen (+ 4 für das jeweiligen Rahmenzeichen an Anfang und Ende der Zeile sowie die zusätzlichen Leerzeichen als Trennung von der eigentlichen Zeile). Die Verwendung von "delayedExpansion" in einem begrenzten Bereich des Batches erlaubt es, die Variablen in der Schleife ohne Verwendung eines Unterprogrammes zu befüllen und trotzdem noch unfallfrei Text mit enthaltenen "!" verwenden zu können.
Die "::DATA"-Zeilen sind für Batch Kommentar (Du könntest auch "REM DATA" verwenden) und werden daher im Ablauf ignoriert, können jedoch in weiterer Folge aus der Batchdatei ausgelesen werden - analog zu den "DATA"-Zeilen in (Uralt-)BASIC.
Dieses Auslesen erfolgt in der Schleife unter Verwendung von "
findstr
", wobei wegen "tokens=1*
" nur das erste vorkommende Leerzeichen (nach "DATA") noch als Trennzeichen interpretiert wird - alle weiteren Leerzeichen bilden einen Bestandteil des zweiten "Tokens": Die so gelesenen Zeilen werden dann dem Unterprogramm zur Formatierung und Ausgabe weitergereicht.In diesem Unterprogramm wird der Zeile zunächst die erforderliche Anzahl an Leerzeichen hinzugefügt und danach die Zeile auf die vorgegeben Anzahl von Zeichen gekürzt - durch die Verwendung des "
call
" kann dabei auch die Variable %len% verwendet werden, ohne dass auch hier "delayedExpansion" eingesetzt werden müsste.Schließlich wird noch die Zeile samt Rahmenzeichen ausgegeben.
Das Unterprogramm ist so ausgelegt, dass es genauso mit
call :WriteFormattedLine "%variable1%"
Zu beachten wäre, dass bestimmte Sonderzeichen (<|>^&) mit besonderer Bedeutung in einem Batch "maskiert" werden müssten, da die Ausgabe der Zeile ohne umschließende Anfürungszeichen erfolgt - die Maskierung könnte (für jedes Zeichen einzeln) etwa so erfolgen:
set "zeile=%zeile:&=^&%"
Noch zu Deinen Fragen:
Zu 1: Aufwändige Variante:
@echo off & setlocal
set "variable1=1234567"
set /a len=0
set "vartemp=%variable1%"
:Loop
if not defined vartemp goto :Done
set "vartemp=%vartemp:~1%"
set /a len+=1
goto :Loop
:Done
echo %variable1% hat %len% Zeichen
Biber-Special:
@echo off & setlocal
set "variable1=1234567"
>%temp%\len.txt echo "%variable1%"
for %%i in (%temp%\len.txt) do set len=%%~zi
set /a len-=4
echo %variable1% hat %len% Zeichen
for /?
Zu 2. und 3.:
set /?
bastla
Hallo Roadrunner777 & bastla.
Nur ergänzend zu den Lösungen zum Punkt 1:
Man kann auch die Offset Option von FINDSTR nutzen
... und es gibt noch mehr Möglichkeiten, sprengt aber den Rahmen 
Grüße
rubberman
Nur ergänzend zu den Lösungen zum Punkt 1:
Man kann auch die Offset Option von FINDSTR nutzen
@echo off &setlocal
set "variable1=1234567"
for /f "skip=1 delims=:" %%i in ('^(echo\"%variable1%"^&echo\^)^|findstr /o $') do set /a length=%%i-5
echo %length%
pause
Grüße
rubberman
[OT]
@rubberman

Grüße
bastla
[/OT]
@rubberman
... sprengt aber den Rahmen 
Schon zu spät - innerhalb des Rahmens haben ja nur 46 Zeichen Platz ... Grüße
bastla
[/OT]