94451
Goto Top

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,...

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 face-smile *musste sein der satz*)


Danke

Grüßle

Content-Key: 152984

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

Printed on: April 24, 2024 at 05:04 o'clock

Member: bastla
bastla Oct 13, 2010 at 20:48:36 (UTC)
Goto Top
Hallo Roadrunner777!
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
Ist jetzt etwas umfangreicher geworden face-wink - die Kurzfassung wäre:
set "zeile=%variable1%                                              "  
echo * %zeile:~,46% *
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 "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%"
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:
set "zeile=%zeile:&=^&%"
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:
@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
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:
@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
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:
for /?
(ziemlich am Ende)

Zu 2. und 3.:
set /?
Grüße
bastla
Member: rubberman
rubberman Oct 13, 2010 at 21:33:46 (UTC)
Goto Top
Hallo Roadrunner777 & bastla.

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
... und es gibt noch mehr Möglichkeiten, sprengt aber den Rahmen face-wink


Grüße
rubberman
Member: bastla
bastla Oct 13, 2010 at 21:38:59 (UTC)
Goto Top
[OT]
@rubberman
... sprengt aber den Rahmen face-wink
Schon zu spät - innerhalb des Rahmens haben ja nur 46 Zeichen Platz ... face-wink

Grüße
bastla
[/OT]
Member: rubberman
rubberman Oct 13, 2010 at 21:52:26 (UTC)
Goto Top
@bastla

*grins* Wenn ich nun schon aus dem Rahmen gefallen bin, kann ich auch noch mal eben zu einer Lösung mittels "logischer Verschiebung" verlinken. Guckst du hier.

Grüße
rubberman
Mitglied: 94451
94451 Oct 14, 2010 at 04:42:27 (UTC)
Goto Top
Vielen Dank für die vielen Lösungen,

ehrlich gesagt hab ich mich jetzt für die Faule methode entschieden,

set "zeile=%variable1%                                              "  
echo * %zeile:~,46% *

damit ich aber was lerne, beschäftige ich mich auch mal mit den anderen Lösungsansätzen,...

vielen Dank nochmal!!!