Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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

Zeichen in variable ersetzen

Frage Entwicklung Batch & Shell

Mitglied: Roadrunner777

Roadrunner777 (Level 1) - Jetzt verbinden

13.10.2010, aktualisiert 22:19 Uhr, 6051 Aufrufe, 5 Kommentare

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

01.
ECHO   ************************************************* 
02.
ECHO   * %variable1%                                   * 
03.
ECHO   * %variable2%                                   * 
04.
ECHO   * %variable3%                                   * 
05.
ECHO   * %variable4%                                   * 
06.
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 *musste sein der satz*)


Danke

Grüßle
Mitglied: bastla
13.10.2010 um 22:48 Uhr
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):
01.
@echo off & setlocal 
02.
set /a len=46 
03.
set "leer=" 
04.
set "stern=" 
05.
setlocal enabledelayedexpansion 
06.
for /L %%i in (1,1,%len%) do ( 
07.
	set "leer=!leer! " 
08.
	set "stern=!stern!*" 
09.
10.
set "stern=**%stern%**" 
11.
setlocal disabledelayedexpansion 
12.
 
13.
::DATA Ueberschrift 
14.
::DATA 
15.
::DATA Kurze Zeile 
16.
::DATA Wirklich gaaaaaaaanz laaaaaaaaange Zeile! 
17.
::DATA Fertig 
18.
 
19.
echo %stern% 
20.
for /f "tokens=1*" %%i in ('findstr /b "::DATA" "%0"') do call :WriteFormattedLine "%%j" 
21.
echo %stern% 
22.
goto :eof 
23.
 
24.
:WriteFormattedLine 
25.
set "zeile=%~1%leer%" 
26.
call set "zeile=%%zeile:~0,%len%%%" 
27.
echo * %zeile% * 
28.
goto :eof
Ist jetzt etwas umfangreicher geworden - die Kurzfassung wäre:
01.
set "zeile=%variable1%                                              " 
02.
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:
01.
@echo off & setlocal 
02.
set "variable1=1234567" 
03.
 
04.
set /a len=0 
05.
set "vartemp=%variable1%" 
06.
:Loop 
07.
if not defined vartemp goto :Done 
08.
set "vartemp=%vartemp:~1%" 
09.
set /a len+=1 
10.
goto :Loop 
11.
 
12.
:Done 
13.
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:
01.
@echo off & setlocal 
02.
set "variable1=1234567" 
03.
 
04.
>%temp%\len.txt echo "%variable1%" 
05.
for %%i in (%temp%\len.txt) do set len=%%~zi 
06.
set /a len-=4 
07.
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
Bitte warten ..
Mitglied: rubberman
13.10.2010 um 23:33 Uhr
Hallo Roadrunner777 & bastla.

Nur ergänzend zu den Lösungen zum Punkt 1:
Man kann auch die Offset Option von FINDSTR nutzen
01.
@echo off &setlocal 
02.
set "variable1=1234567" 
03.
for /f "skip=1 delims=:" %%i in ('^(echo\"%variable1%"^&echo\^)^|findstr /o $') do set /a length=%%i-5 
04.
echo %length% 
05.
pause
... und es gibt noch mehr Möglichkeiten, sprengt aber den Rahmen


Grüße
rubberman
Bitte warten ..
Mitglied: bastla
13.10.2010 um 23:38 Uhr
[OT]
@rubberman
... sprengt aber den Rahmen
Schon zu spät - innerhalb des Rahmens haben ja nur 46 Zeichen Platz ...

Grüße
bastla
[/OT]
Bitte warten ..
Mitglied: rubberman
13.10.2010 um 23:52 Uhr
@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
Bitte warten ..
Mitglied: Roadrunner777
14.10.2010 um 06:42 Uhr
Vielen Dank für die vielen Lösungen,

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

01.
set "zeile=%variable1%                                              " 
02.
echo * %zeile:~,46% *
damit ich aber was lerne, beschäftige ich mich auch mal mit den anderen Lösungsansätzen,...

vielen Dank nochmal!!!
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
gelöst Suchen ersetzen mit Sonderzeichen (2)

Frage von GNLen1 zum Thema Batch & Shell ...

Windows 10
gelöst Werden Dateien beim Ersetzen wirklich überschrieben? (3)

Frage von Nexder zum Thema Windows 10 ...

Microsoft Office
Via SCCM Office 2013 32bit ersetzen durch Office 2016 64bit (9)

Frage von KarstenF zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
Linux
gelöst Boot failed: not a bootable disk (10)

Frage von Fleckmen zum Thema Linux ...

Windows Server
Probleme mit Client Software Zugriff auf Windows Server 2012 (8)

Frage von it-kolli zum Thema Windows Server ...

Multimedia & Zubehör
gelöst Iphone 6 prob (8)

Frage von jensgebken zum Thema Multimedia & Zubehör ...

Windows Installation
Eine etwas (wirklich) speziellere Frage: Windows 10-Installation über (7)

Frage von DerFurrer zum Thema Windows Installation ...