Batch-Parameter Ausgabe in selbe Zeile?

2 Antworten

Damit Du nicht nur hohlköpfig kopierst erkläre ich mal wie es funktioniert...

Um immer wieder in die gleiche Zeile zu schreiben darf man als erstes nicht die aktuelle Zeile verlassen.

Dies geschied etwas Tricky indem man die Ausgabefunktion von set /p missbraucht. Diese gibt einen String aus und wartet in der gleichen Zeile auf eine Eingabe. Statt etwas Einzugeben und Enter zu drücken lesen wir aus eine Datei, die Nichts enthält (<nul). Ergo wird nie Enter gedrückt und wir bleiben in der gleichen Zeile...

Jeder Aufruf schreibt in der gleichen Zeile weiter...

Damit wir den Aktuellen Text der Zeile loswerden. müssen wir rückwärts schreiben. Das macht von Hand die Rücktaste .

In Unserem Fall muss der Rückschritt (Backspace) künstlich erzeugt werden . Es gibt keine Möglichkeit ein Backspace per Tastatur in eine Datei zu schreiben😏. der Promtbefehl kann jedoch dieses unschreibbare Zeichen generieren. (man muss nur Zaubern um dieses Zeichen in eine Variable zu "hieven")

Da die meisten Ausgaben jedoch länger als 1 Zeichen sind brauchen wir Ganz viele Backspaces um viele Schritte zurückzugehen. (in der Demo 80...)

Der Rest ist Trivial : Wir schreiben vor jeder neuen Ausgabe der Zeile 80..Rückwärtsschritte (die Variable %bk_ln% enthält diese) und dann das was angezeigt werden soll.

Weder %bs% noch %bk_ln% lassen sich anzeigen!

@echo off
 rem Erzeuge Zeile aus backspace Characters... %BS% ist ein Rückschritt
for /f "delims=;" %%a in ('"prompt $H; & for %%. in (nul) do call "') do (set "BS=%%a")
 rem das ganze 80mal (die Länge spielt keine rolle, es gehtt nie weiter zurück als der Zeilenanfang)
for /l %%n in (1,1,80) do (call set "bk_ln=%%bk_ln%%%BS%")


for /l %%a in (120,-1,1) do (
  rem schreibe 80 Backspaces (%bk_ln%) und anschließend den gewünschten String
  <nul set /p "=%bk_ln%Countdown=%%a Minipippie"||ver>nul
  timeout 1 >nul
)
 rem neue Zeile
echo:
pause

das gelegentlich die Anzeige flackert lässt sich nicht vermeiden. Batch ist nunmal nicht gemacht um irgendwelchen Budenzauber zu veranstalten.

aber man kan auch Animieren...

@echo off
setlocal enabledelayedexpansion
rem create line of 162 (2* 3^4) backspace characters...(an exponent of 5 will create 486 backspaces!)
for /f "delims=;" %%. in ('"prompt $H; & for %%. in (nul) do call"') do ( set "bs=%%.")


set "roler[0]=%bs%%bs%%bs%%bs%\- /"
set "roler[1]=%bs%%bs%%bs%%bs%|- -"
set "roler[2]=%bs%%bs%%bs%%bs%/ -\" 
set "roler[3]=%bs%%bs%%bs%%bs%- -|"


echo  Warte auf  die Erzeugung von x.txt
echo  ...bitte  erzeuge diese  von  Hand im Batchverzeichnis


:loop
call :roler
if not exist "x.txt" goto :loop
<nul set /p "=%bs%%bs%%bs%%bs%Hurahhhh,  du hast es geschafft"|| ver >nul
echo:  
pause
exit /b 




:roler
set /a "z=(z+1) %% 4 "
<nul set /p "=!roler[%z%]!"|| ver >nul
exit /b


Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

JDoeGF 
Fragesteller
 12.03.2020, 09:33

Vielen Dank...das war genau, was ich gesucht hatte! :)

0
@echo off
set /a zaehler=10
:REPEAT
echo | set /p=%zaehler%
set /a zaehler=%zaehler%-1
if %zaehler%==0 ( goto DONE )
goto REPEAT
:DONE
pause

So wäre das ziemlich simpel gehalten.


JDoeGF 
Fragesteller
 11.03.2020, 14:33

Hi skiddy..danke erstmal für die Antwort...prinzipiell ja..allerdings möchte ich nicht die Zahlen hintereinander...sondern...anstatt..

Bitte warten: 10

Bitte warten: 9

Bitte warten: 8

usw....

..jedoch immer in der selben Zeile!

0
skiddy  11.03.2020, 15:09
@JDoeGF

Dann musst du nur noch ein "Bitte warten:" hinzufügen:

@echo off
set /a zaehler=10
:REPEAT
echo Bitte warten: %zaehler%
set /a zaehler=%zaehler%-1
if %zaehler%==0 ( goto DONE )
goto REPEAT
:DONE
pause
0
JDoeGF 
Fragesteller
 11.03.2020, 15:12
@skiddy

..das ist schon klar..er soll es aber nicht alles untereinander ausgeben, sondern immer in der selben Zeile!

0
skiddy  11.03.2020, 15:13
@JDoeGF

Du hast es aber gerade anders geschrieben.
Es macht das was du geschrieben hast. Ausgabe:

Bitte Warten: 10
Bitte Warten: 9
.
.
.

0
JDoeGF 
Fragesteller
 11.03.2020, 15:13
@skiddy

"..jedoch immer in der selben Zeile!"

0
skiddy  11.03.2020, 15:15
@JDoeGF

Was willst du denn jetzt in der selben Zeile drück dich klar aus. Willst du jetzt das hier haben:

REM Output 
Bitte warten: 10
Bitte warten: 9
Bitte warten: 8
Bitte warten: 7
etc.

oder das hier:

REM Output
Bitte warten: 10 Bitte warten: 9 Bitte warten: 8 etc.

?

0
JDoeGF 
Fragesteller
 11.03.2020, 15:21
@skiddy
..keines von beiden..
0
skiddy  11.03.2020, 15:23
@JDoeGF

Dann verstehe ich nicht was du eigentlich willst. Wenn du trollen willst dann wo anders aber nicht hier. Nach deinem Beitrag gibt es keine andere Möglichkeit. Wenn du dich nicht einfach verständlicher ausdrücken kannst, dann kann man dir auch nicht helfen. Probier es doch alleine aus. Wenn du nicht weißt wie, dann frag Dr. Google.

0
JDoeGF 
Fragesteller
 11.03.2020, 15:26
@skiddy

..nun gut..ist ja auch schwer zu beschreiben...mit echo selber geht es nicht...Dr.Google hab ich alles durch...was hat das mit trollen zu tun?

In der selben Zeile soll nur die Anzahl der Sekunden stehen...nicht hintereinander,nicht untereinander...nur die aktuelle Sekundenzahl..alleine!

0
skiddy  11.03.2020, 15:38
@JDoeGF

Jetzt weiß ich endlich was du willst. Danke. Das hier sollte es eigentlich machen:

@echo off
set /a zaehler=10
:REPEAT
@ping -n 2 localhost>nul
cls
echo Noch warten: %zaehler%
set /a zaehler=%zaehler%-1
if %zaehler%==0 ( goto DONE )
goto REPEAT
:DONE
pause
0
Erzesel  11.03.2020, 16:06
@skiddy

Den gesamten Inhalt der Console mit cls zu löschen,nur um eine Ziffer zu verändern, ist wie mit Kanonen auf Spatzen schießen🤪

Bei einer kleinen Ausgabe ist das ja noch tragbar... aber gelegentlich möchte man nicht unbedingt das gesamte Fenster neu schreiben aber Cls ist gnadenlos....

0
skiddy  11.03.2020, 16:47
@Erzesel

Ist mir schon klar, aber ich programmiere keine Batch-Dateien. Daher habe ich nur das Nötigste genommen.

0