Batch - set/p mit Countdown?

2 Antworten

no Way... Zumindest nicht in Batch. Dazu braucht man schon C# oder Powershel etc.

wenn Du wirklich etwas brauchst das eine gewisse Zeit auf eine Eingabe "lauert" und sich dann unverrichteter Dinge vom Acker macht verwende choice.

Das liest zwar nur einen Buchstaben, aber das sollte genügen um den Nutzer entscheiden zu lassen ob er was eingeben möchte oder nicht 😉.

choice /c JN /t 5 /d N /m "willst du selbst was eingeben?"
if %errorlevel% equ 1 (
  set /p "input=gib was ein:"
) else (set "input=Ich hab mich automatisch eingetragen")
echo "%input%"
pause

Das kann wirklich nur mit einem Zeichen funktionieren, da Choice das Ergebnis als Errorlevel zurückgeben muss, da die Eingabe bei einer Variablenzuweisung nicht sichtbar wäre.

Ich habe diesbezüglich auch schon herumgefummelt, aber wie man es auch dreht und wendet es gibt immer einen Pferdefuß .

In Powershell kein kein:

demo.ps1

$breaktime=(Get-Date).AddSeconds(5)
$str=''
'Gib etwas ein oder warte 5 sekunden'
do{
    if ([Console]::KeyAvailable){
        $key=([Console]::ReadKey($false))
        if ($key.key -eq 'Enter') {break}
        $str+=$key.KeyChar
    }
    Start-Sleep -Milliseconds 10 #damit die Schleife etwas gemächlicher läuft
} while (((get-Date) -lt $breaktime) -or ($str -ne '')) #mach das solange die Abbruchzeit nicht erreicht ist und $str zu diesem Zeitpunkt nichts enthällt.

''
'Du hast folgendes einegeben:{0}' -f $str
pause

Das funktioniert jedoch nur, weil Powershell und andere Hochsprachen Variablen direkt zuweisen können. Wird ja nur dr Output über for/f-'Command' zugewiesen.

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

PS bei der Gassirunde ist mir eine Idee gekommen....

hier noch ein ganz schmutziger Trick:

Belege die Defaulttaste mit dem Zeichen, welches garantiert nicht als erstes eingegeben wird. Der Parameter /d löst dieses automatisch aus (hier 0).

Die Errorlevels sind völlig Wurst. da alle ausgaben von Choice blockiert sind, bekommt die Schleif nur das eingegebene Zeichen zu sehen und übergibt dieses in %%a.

Erstmal übergeben wir %%a an set/p als anzuzeigenden Text. Auf diese Weise merkt der Nutzer nix von der Mogelei und gibt nichtsahnend die übrigen Zeichen ein. Die Variable Input enthält nun alles außer dem 1.Zeichen. Die nächste Zeile fügt das erste Zeichen (in %%a) der Variable Input vorne dran.

@echo off
set "autoChar=0"
<nul set /p "=gib was ein :"
for /f %%a in ('choice /c ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 /cs /n /t 5 /d %autoChar%') do (
    if "%%a" neq "%autoChar%" (
        set /p "input=%%a"
        call set input=%%a%%Input%%
    ) else (echo:)
    )
)

echo du  hast folgendes eigegeben. "%input%"
pause

Wie alle Schmutzigen Sachen hat die Nummer einen Pferdfuß. Choise kann Nur Buchstaben und Ziffern verarbeiten. Sonderzeichen und Umlaute funktionieren nicht.

Also, das erste zechen darf nicht unser AutomatikCharakter sein und nur normale Buchstaben und Ziffern.

die Folgende "Billigvariante" spiel darauf an, das der Nutzer "irgendwie🤫😏" den ersten Buchstaben nicht richtig gedrückt hat? (psychologie)...also drückt er nochmal, aber dann schon in set/p.

@echo off
<nul set /p "=gib was ein :"
choice /c 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ /t 5 /d 0 >nul
    if %errorlevel% equ 1 (echo:&set "input=Ich hab mich automatisch eingetragen"
) else (set /p "input=")
echo "%input%"
pause

Hier ist es wichtig , dass der Defaultchar an erster stelle steht (errorlevel 1)!

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