mathe172
Goto Top

Rahmen-Sonderzeichen ausgeben

Hallo zusammen!

Ich bin an einer Batch dran, die bestimmte Aufgaben automatisieren soll,hauptsächlich für solche, die es sonst nicht checken.Jetzt wollte ich mit diesen Rahmenzeichen der Codepage 850 (═,╔,╚,║,╝,╗,...) so eine Art Kopfzeile machen. Also hab ich die Zeichen mal ausprobiert im Prompt (Also "Alt+2+0+0" oder so). Hat alles auch super geklappt. Nun wollt ich das ganze in die Batch schreiben (Also etwa: echo.╔══╗). Jetzt spuckt er aber nur Blödsinn aus (ÔèÉ). Wenn ich aber im Fenster direkt "echo.╔══╗" eingebe, funktioniert es.
Danach habe ich den ganzen Rahmen mal nur mit "#" gemacht. Dabei fiel mir auf, das wenn ich die ganze Zeile mit "#" (bei mir 80) fülle, dass es dann eine Leerzeile gibt.
Kennt jemand eines dieser Probleme? Wenn eines gelöst würde, würde es im Notfall(wenn das andere überhaupt nicht geht) reichen.

Mathe172

Content-ID: 148443

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

Ausgedruckt am: 21.11.2024 um 17:11 Uhr

jeb-the-batcher
jeb-the-batcher 05.08.2010 um 19:38:58 Uhr
Goto Top
Hallo Mathe172,

dein Rahmenproblem ist ein Zeichensatzproblem
Teste einfach mal auf der Kommandozeile:

echo @echo ╚╔ >> c:\temp\rahmen.bat
Danach sollte rahmen.bat die Rahmenzeichen korrekt ausgeben, und mit ein Editor Deiner Wahl wird Dir scheinbarer Zeichenmüll angezeigt, aber an sich klappt es so.

Das Problem mit den 80 Zeichen ist dadurch begründet, dass nach einer Ausgabe mit echo immer ein CR/LR ausgegeben wird.
Da aber bereits 80 Zeichen ausgegeben wurden steht der Cursor bereits in der nächsten Zeile ein CR/LF bewirkt dann eine Leerzeile.
Entweder die "80er" Zeilen einfach ausgeben mit (hängt kein CR/LF an die Ausgabe an)
 <nul set /p .=Mein Rahmen

Oder man baut seinen Rahmen so, dass er mit nur einem Echo ausgegeben wird
echo %RamenZeile1%%RamenZeile2%%RamenZeile3%...

Oder man verwendet ein LF Zeichen um mit einem Echo mehrere Zeilen direkt auszugeben
@echo off
setlocal EnableDelayedExpansion
set lf=^


rem Hier müssen zwei Leerzeile sein, damit das LF erzeugt werden kann
set "Line1=╔══════╗"  
set "Line2=║      ║"  
set "Line3=╚══════╝"  
echo %Line1%!lf!%Line2%!lf!%Line2%!lf!%Line3%
Arano
Arano 05.08.2010 um 19:43:41 Uhr
Goto Top
Hallo mathe172

Zu 1.: Tut mir Leid, keine Ahnung.

Zu 2.: Eigentlich ganz logisch face-big-smile
Was macht ein echo am Ende ? Es fügt einen Zeilenumbruch hinzu !
Und schon sind es 81 Zeichen. 80 davon füllen deine erste Zeile, das letzte Zeichen (was jetzt dem Zeilenumbruch vom echo entspricht) steht damit an erster stelle in der zweiten Zeile. Nun tut ein Zeilenumbruch was ein Zeilenumbruch tun muss und macht nen Zeilenumbruch - Willkommen in Zeile DREI.
Das ist alles...


~Arano
mathe172
mathe172 05.08.2010 um 20:44:27 Uhr
Goto Top
Hallo zusammen!

Danke, es klappt super! Ich hab zwar beides schonmal gehört, war aber offensichlich u blöd um draufzukommen.

Mathe172
pieh-ejdsch
pieh-ejdsch 05.08.2010 um 20:45:49 Uhr
Goto Top
Hi Mathe,

Hier etwas fertiges:
::1
::: Dieses Umrahmte Menue ist so Breit wie
::: die laengste Zeile aus diesen Menue PLUS Rahmen
::: 
::: Bei Maximaler Ausnutzung sind 77 Zeichen in der Breite Nutzbar
::: Dazu einfach die Variable HMax entsprechend setzen!
:::
::: Die fuehrenden 3 Doppelpunkte PLUS Leerzeichen
::: sind fuer die Menueerkennung erforderlich!
::: 
::: Wenn Du das Menue Zentrieren moechtest -
::: (also vorne auch ein Leerzeichen), dann setze in die
::: For-Schleife noch jeweils ein Leerzeichen hinter echo
::: 
::: Dafuer kannst Du aber nur 76 Zeichen Verwenden!
::: 
::: die erste Zeile (mit ::1 ) muss so bleiben!
::: Die letzte Zeile Markiert das Ende und dient als Lineal.
::; 1...5....|....,....|....,....|....,....|....,....|....,....|....,..70|....77|

@echo off&setlocal

:: HMax --- Horizontale Breite
set /a HMax=0,vor=0

setlocal enabledelayedexpansion
for /f "delims=:" %%i in ('findstr /o /b "::: ::;" "%~f0"') do (set /a Max = %%i - vor -6  
	if !HMax! lss !Max! set "HMax=!Max!"  
	set "vor=%%i"  
)
for /l %%i in (1,1,%HMax%) do (call set "V=!V!Í"  
	call set "empty=!empty! "  
)
endlocal & (set /a HMax = %HMax% & set "empty=%empty%" & set "V=%V%")  

:: Rahmenerstellung
for /f "usebackq tokens=1,*" %%i in ("%~f0") do (set "Line=%%j%empty%"  
	setlocal enabledelayedexpansion
	set "Line=!Line:~0,%HMax%!  
	if "%%i" == "::1" echo É%V%»  
	if "%%i" == ":::" echo º!Line!º  
	if "%%i" == "::;" echo È%V%¼  
	endlocal
)
pause
goto :eof

Gruß Phil