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

Echo ohne Zeilenumbruch und ähnliche Spielereien

Anleitung Entwicklung Batch & Shell

Mitglied: Ren

Ren (Level 1) - Jetzt verbinden

23.11.2008, aktualisiert 03.12.2008, 41590 Aufrufe, 5 Kommentare

Den Befehl ECHO kennt ja jeder. Damit lässt 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 möglich.

So ohne weiteres käme 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 für die Variable selbst eingeben kann. Syntax:
set /p VARIABLENMANE=TEXT, DEN DER BENUTZER VOR DER EINGABE SEHEN KÖNNEN 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 KÖNNEN 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 müssen sozusagen einen Zeilenumbruch, der als Return gewertet wird, unserem SET-Befehl übergeben.
echo.|set /p =TEXT, DEN DER BENUTZER VOR DER EINGABE SEHEN KÖNNEN 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 KÖNNEN SOLL<nul
Mit dieser Funktion kann man jetzt lustige, teilweise sinnvolle oder auch weniger sinnvolle Dinge machen:
Wie wäre es mit einem "Schnecken-CLS" (CLS löscht den Bildschirminhalt)
(for /L %i in (1,1,2000) do @set /p = <nul)&cls
Wer es braucht.
Auf diese Art und Weise lässt 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 =Hello•World<nul
würde also die Ausgabe
Hello World
auf der Konsole erzeugen.

So, dann habe ich noch ein total sinnvolles Feature:
01.
@echo off 
02.
call :schreib "Dies ist ein Demotext!" 32100 
03.
:schreib 
04.
if not "%2"=="" set /a limit=%2 
05.
if "%2"=="" set /a limit=32000 
06.
if not defined text set text=%~1 
07.
if not defined text goto :eof 
08.
 
09.
set /P =%text:~0,1%<nul 
10.
:loop1 
11.
if %random% LSS %limit% goto :loop1 
12.
set text=%text:~1% 
13.
if defined text (goto :schreib) else (echo.) 
14.
goto :eof
Hintergrund des Ganzen ist wieder das set /p = Text<nul. Es wird Zeichenweise der Text, der übergeben wurde, ausgegeben. Zwischendurch wird eine zufällige Zeit gewartet. Diese Zeit resultiert daraus, dass %random% einen Wert zwischen 1 und 32767 liefert. Je näher man die Zahl, die man :schreib übergeben kann, der 32767 annähert, desto langsamer wird die Ausgabe. Sinnvoll sind Zahlen um die 32000 herum: Je größer die Zahl, desto unregelmäßiger 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 nützliches Programm geschrieben.
1. lässt 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:
01.
@echo off 
02.
color 0A 
03.
:matrix 
04.
set /a text=%random% 
05.
if %text% LSS 10000 <nul set /p = !!  
06.
if %text% LSS 5000 <nul set /p = ## 
07.
if %text% LSS 2 <nul set /p =   
08.
if 32766 LSS %text% <nul set /p =   
09.
if 31766 LSS %text% <nul set /p = ?? 
10.
if 32366 LSS %text% <nul set /p = $$ 
11.
set /p = %text%<nul 
12.
goto :matrix
Diese ulkigen  in Zeile 7 und 8 waren bei mir wieder Piep-Töne (s.o.), damit wird die Ausgabe dann wirklich total unerträglich.
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 = tatsächlich 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 tatsächlich: 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?
01.
@echo off 
02.
:countsheep 
03.
set /a text += 1 
04.
set /p = %text%<nul 
05.
goto :countsheep
Wie weit kann euer PC zählen?
Für 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 möchte keine neue Diskussion darüber losbrechen, ob es möglich ist, den Fortschritt zu bestimmen, ich möchte ihn einfach nur ausgeben)
01.
@echo off & setlocal 
02.
::echo Alle Dateien zählen... 
03.
for /F "tokens=1" %%a in ('dir *.* ^| findstr "Datei(en)" ') DO (set /a files=%%a) 
04.
::Ende und Anfang malen, das sind 100% 
05.
fOR /L %%t IN (1,1,%files%) DO <NUL set /p =- 
06.
echo. 
07.
::Mach etwas mit jeder Datei und male dabei den Fortschritt 
08.
for /F "tokens=1" %%a in ('dir *.* /a-D /b') DO (<NUL set /p =.& type %%a>>muell.txt) 
09.
echo. 
10.
endlocal
Diese Batch macht nichts sinnvolles. Sie zählt 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 für den Einen oder Anderen das Eine oder Andere wiederverwendbare dabei.
Gruß
Ren
Mitglied: 70620
24.11.2008 um 10:58 Uhr
Schöne Spielerei am Ende, aber insgesamt wars doch hilfreich für mich.
Naja.. erstmal nice to know, aber man weiss ja nie (zuwenig)

thx
Bitte warten ..
Mitglied: TheUntouchable
03.12.2008 um 14:19 Uhr
Das mit dem Ausgeben ohne Zeilenumbruch ist wirklich super, ich suche schon seit ewigkeiten nach so einer Möglichkeit! Danke für den Tipp :D
Bitte warten ..
Mitglied: Progfreund
05.07.2011 um 11:42 Uhr
Danke für 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 Rückmeldung, die als Return interpretiert wird, sodass
man auch <%TEMP%\Beispiel.txt nehmen könnte?

Welche Variable wird hier unter welchem Namen gesetzt?
01.
set /p = %text%<nul 
02.
if %text% LSS 2 <nul set /p =   
03.
if 31766 LSS %text% <nul set /p = ??
Wäre es in deiner Schreibweise auch möglich, set /p "=%text%<nul" mit
Anführungszeichen zu schreiben?

LG
Bitte warten ..
Mitglied: bastla
05.07.2011 um 21:16 Uhr
Hallo Progfreund!
Wäre es in deiner Schreibweise auch möglich, set /p "=%text%<nul" mit
Anführungszeichen zu schreiben?
Du hast es aber mit den Anführungszeichen ...

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 dafür verwendest, ist völlig egal, da diese Eingabe ohnehin ignoriert wird - es geht ja nur darum, die Ausgabe zu erzeugen.

Grüße
bastla
Bitte warten ..
Mitglied: timlg07
05.11.2016 um 13:54 Uhr
Auch sehr praktisch wenn man etwas in eine Datei schreiben will, ohne einen Zeilenumbruch automatisch einzufügen:

01.
@echo off 
02.
set x=0 
03.
:loop 
04.
set /a x+=1 
05.
echo.|set /p =%x%; >> data.dat 
06.
goto loop
coole Sache, immer gut zu wissen.
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst Echo in Batch schreibt vorab eine 1 (1)

Frage von chappy72 zum Thema Batch & Shell ...

Sonstige Systeme
Amazons Echo im Test: Beim Dankesagen ertappt (4)

Link von Frank zum Thema Sonstige Systeme ...

PHP
gelöst PHP XML Statt Semikolon ein Zeilenumbruch (2)

Frage von Judo99 zum Thema PHP ...

Batch & Shell
gelöst CMD Echo in Fett, Kursiv oder unterstrichen ausgeben (8)

Frage von Luuke257 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...