You are on page 1of 3

Echo ohne Zeilenumbruch und hnliche Spielereien - Druckansicht - ad...

http://www.administrator.de/article/detail_print.php?nr=102460

http://www.administrator.de - IT-Wissen, Forum und Netzwerk

Echo ohne Zeilenumbruch und hnliche Spielereien


Typ: Anleitung Permanent-ID: 102460 Bereich: Batch & Shell Dieser Beitrag wurde bisher 15744 mal aufgerufen. Geschrieben von Ren am 23.11.2008 um 16:13:27 Uhr.

Den Befehl ECHO kennt ja jeder. Damit lsst sich einen Zeile, mit ECHO. auch einen leere, auf dem Bildschirm ausgeben. ECHO macht aber auf jeden Fall einen Zeilenumbruch nach dem Text. Dem einen oder anderen ist sicher schon mal der Wunsch aufgekommen, etwas auf den Bildschirm zu schreiben, ohne gleich die Zeile umzubrechen. Auch das ist mglich. So ohne weiteres kme man wahrscheinlich nicht auf die Idee, dass das mit Hilfe des Befehls SET geht. Genauer mit Hilfe des Befehls SET mit der Option /p. SET weist Variablen Werte zu. /p kann dazu verwendet werden, dass der Benutzer den Wert fr die Variable selbst eingeben kann. Syntax: set /p VARIABLENMANE=TEXT, DEN DER BENUTZER VOR DER EINGABE SEHEN KNNEN SOLL Der Clou: Man kann den Variablennamen einfach weglassen. Der Text wird immer noch ausgegeben, OHNE Zeilenumbruch. set /p =TEXT, DEN DER BENUTZER VOR DER EINGABE SEHEN KNNEN SOLL Dummerweise wird jetzt immer noch auf eine Eingabe des Benutzers gewartet. Aber dem Problem geht man einfach mit Hilfe der Pipe-Funktion aus dem Weg. Wir mssen sozusagen einen Zeilenumbruch, der als Return gewertet wird, unserem SET-Befehl bergeben. echo.|set /p =TEXT, DEN DER BENUTZER VOR DER EINGABE SEHEN KNNEN SOLL So, wir haben jetzt ein Echo, das keinen Zeilenumbruch macht. Alternativ geht brigens auch, einfach NUL dem Befehl mitzugeben. set /p =TEXT, DEN DER BENUTZER VOR DER EINGABE SEHEN KNNEN SOLL<nul Mit dieser Funktion kann man jetzt lustige, teilweise sinnvolle oder auch weniger sinnvolle Dinge machen: Wie wre es mit einem "Schnecken-CLS" (CLS lscht den Bildschirminhalt) (for /L %i in (1,1,2000) do @set /p = <nul)&cls Wer es braucht. Auf diese Art und Weise lsst sich auch ein "Beep" ausgeben, ohne dass die Zeile umgebrochen wird. Wer nicht wei, dass man in Batch-Dateien berhaupt herumpiepen kann, der lernt jetzt etwas ganz neues: set /p =<nul Dieses soll das Asci-Zeichen BEEP sein. In meinem Editor kann ich es ber Strg+G bekommen, in Notepad++ tut es ein Alt+007 (kann man sich doch merken, oder nicht?) Wie schon geschrieben. Das 7. ASCI-Zeichen ist ein BEEP. Wird das auf die Konsole geschrieben, piept der Rechner. Da es wirklich ein Zeichen ist, wird der Cursor eins weiter geschoben. set /p =HelloWorld<nul wrde also die Ausgabe Hello World auf der Konsole erzeugen. So, dann habe ich noch ein total sinnvolles Feature:
Quelltext | in den Speicher kopieren | drucken

01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14.

@echo off call :schreib "Dies ist ein Demotext!" 32100 :schreib if not "%2"=="" set /a limit=%2 if "%2"=="" set /a limit=32000 if not defined text set text=%~1 if not defined text goto :eof set /P =%text:~0,1%<nul :loop1 if %random% LSS %limit% goto :loop1 set text=%text:~1% if defined text (goto :schreib) else (echo.) goto :eof

Hintergrund des Ganzen ist wieder das set /p = Text<nul. Es wird Zeichenweise der Text, der bergeben wurde, ausgegeben. Zwischendurch wird eine zufllige Zeit gewartet. Diese Zeit resultiert daraus, dass %random% einen Wert zwischen 1 und 32767 liefert. Je nher man die Zahl, die man :schreib bergeben kann, der 32767 annhert, desto langsamer wird die Ausgabe. Sinnvoll sind Zahlen um die 32000 herum: Je grer die Zahl, desto unregelmiger wird es auch. brigens: bei schreib ist mir etwas aufgefallen. Alle Schaltjahre kommt es mal vor, dass scheinbar das <nul nicht funktioniert. Um das zu verifizieren, habe ich folgendes ebenfalls sehr ntzliches Programm geschrieben. 1. lsst es die CPU brennen. 2. sieht es ein wenig nach Matrix aus, und 3. findet es den Fehler in der selbigen gleich. Es bleibt einfach ab und an stehen:
Quelltext | in den Speicher kopieren | drucken

01. 02. 03. 04.

@echo off color 0A :matrix set /a text=%random%

1 von 3

18.10.2011 15:36

Echo ohne Zeilenumbruch und hnliche Spielereien - Druckansicht - ad...

http://www.administrator.de/article/detail_print.php?nr=102460

05. 06. 07. 08. 09. 10. 11. 12.

if %text% LSS 10000 <nul set /p = !! if %text% LSS 5000 <nul set /p = ## if %text% LSS 2 <nul set /p = if 32766 LSS %text% <nul set /p = if 31766 LSS %text% <nul set /p = ?? if 32366 LSS %text% <nul set /p = $$ set /p = %text%<nul goto :matrix in Zeile 7 und 8 waren bei mir wieder Piep-Tne (s.o.), damit wird die Ausgabe dann wirklich total unertrglich.

Diese ulkigen

In dem Beispiel sieht man brigens noch was sinnvolles: ich habe statt set /p = !!<nul einfach <nul set /p = !! genommen. Dann kann man sich den ersten Teil <nul set /p = tatschlich als echo ohne Zeilenumbruch merken, und einfach in die Zwischenablage kopieren. brigens habe ich auch statt <nul echo.| versucht, um festzustellen, ob auch das nicht immer geht. Und tatschlich: geht auch nicht, es ist mir aber noch etwas aufgefallen. Mit echo.| ist die Matrix wesentlich langsamer als mit <nul. Preisfrage: Warum bleibt folgendes Programm nicht stehen?
Quelltext | in den Speicher kopieren | drucken

01. 02. 03. 04. 05.

@echo off :countsheep set /a text += 1 set /p = %text%<nul goto :countsheep

Wie weit kann euer PC zhlen? Fr den Schluss habe ich mir noch ein Schmankerl aufgehoben. Hier im Forum wird das Thema hitzig diskutiert. Richtig, es geht um die Fortschrittsanzeige. (Nein, ich mchte keine neue Diskussion darber losbrechen, ob es mglich ist, den Fortschritt zu bestimmen, ich mchte ihn einfach nur ausgeben)
Quelltext | in den Speicher kopieren | drucken

01. 02. 03. 04. 05. 06. 07. 08. 09. 10.

@echo off & setlocal ::echo Alle Dateien zhlen... for /F "tokens=1" %%a in ('dir *.* ^| findstr "Datei(en)" ') DO (set /a files=%%a) ::Ende und Anfang malen, das sind 100% fOR /L %%t IN (1,1,%files%) DO <NUL set /p =echo. ::Mach etwas mit jeder Datei und male dabei den Fortschritt for /F "tokens=1" %%a in ('dir *.* /a-D /b') DO (<NUL set /p =.& type %%a>>muell.txt) echo. endlocal

Diese Batch macht nichts sinnvolles. Sie zhlt die Dateien, damit sie wei, wie weit sie ist, wenn sie mit jeder Datei etwas macht. Dann "kopiert" sie mit Hilfe von type den Text jeder Datei in die Text-Datei muell.txt. Ich hoffe, das Lesen dieser Anleitung war nicht zu langweilig, vielleicht war ja fr den Einen oder Anderen das Eine oder Andere wiederverwendbare dabei. Gru Ren

70620 schreibt am 24.11.2008, 10:58:47 Uhr

Schne Spielerei am Ende, aber insgesamt wars doch hilfreich fr mich. Naja.. erstmal nice to know, aber man weiss ja nie (zuwenig) thx

TheUntouchable schreibt am 03.12.2008, 14:19:06 Uhr

Das mit dem Ausgeben ohne Zeilenumbruch ist wirklich super, ich suche schon seit ewigkeiten nach so einer Mglichkeit! Danke fr den Tipp :D

Progfreund schreibt am 05.07.2011, 11:42:35 Uhr

Danke fr deine Anleitung. Ich bin mir bei der Verwendung des Codes nicht ganz sicher. Warum werden echo. und <nul als return gewertet? Sind sie quasi nur eine Rckmeldung, die als Return interpretiert wird, sodass man auch <%TEMP%\Beispiel.txt nehmen knnte? Welche Variable wird hier unter welchem Namen gesetzt?
Quelltext | in den Speicher kopieren | drucken

01. 02. 03.

set /p = %text%<nul if %text% LSS 2 <nul set /p = if 31766 LSS %text% <nul set /p = ??

Wre es in deiner Schreibweise auch mglich, set /p "=%text%<nul" mit Anfhrungszeichen zu schreiben? LG

bastla schreibt am 05.07.2011, 21:16:53 Uhr

2 von 3

18.10.2011 15:36

Echo ohne Zeilenumbruch und hnliche Spielereien - Druckansicht - ad...

http://www.administrator.de/article/detail_print.php?nr=102460

Hallo Progfreund! Wre es in deiner Schreibweise auch mglich, set /p "=%text%<nul" mit Anfhrungszeichen zu schreiben? Du hast es aber mit den Anfhrungszeichen ... Versuch es so: <nul set /p=""%text%""

Warum werden echo. und <nul als return gewertet? Da ein "set /p" eine Eingabe erwartet, wird mit "echo." oder der Eingabeumleitung "<" eine solche geliefert; ob Du "Nichts" (nul) oder den Inhalt einer beliebigen Datei dafr verwendest, ist vllig egal, da diese Eingabe ohnehin ignoriert wird - es geht ja nur darum, die Ausgabe zu erzeugen. Gre bastla

Titel: "Echo ohne Zeilenumbruch und hnliche Spielereien" Ausgedruckt am: 18.10.2011 um 15:36:47 Uhr. URL: http://www.administrator.de/index.php?content=102460 http://www.administrator.de - IT-Wissen, Forum und Netzwerk

3 von 3

18.10.2011 15:36