Batch - set/p mit Countdown?
Hayo! =)
Ich würde gerne in meiner Batch Datei eine Eingabe mit
set/p "beispiel=Eingabe: "
so umsetzen, dass zb 5 Sekunden ablaufen und er dann einen goto befehl ausführt.
Ideen? =)
3 Antworten
Moin,
geht ganz einfach per wscript.exe als .VBS Datei.
In der Batchdatei wird das folgende "Programm" definiert
(mit GOTO :PRG_MAIN_START wird es im eigentlichen BATCH-Programm "übersprungen"
GOTO :PRG_MAIN_START
REM :WAIT_VBS!LABEL
:WAIT_VBS
IF NOT _%1==_ SET WAIT_TIME=%1
IF NOT _%WAIT_TIME%==_ ECHO WScript.Sleep (%WAIT_TIME%) >%TMP%\WAIT_VBS_%RUN_VARIANT%.VBS
IF NOT _%WAIT_TIME%==_ START /WAIT %TMP%\WAIT_VBS_%RUN_VARIANT%.VBS
IF NOT _%WAIT_TIME%==_ IF EXIST %TMP%\WAIT_VBS_%RUN_VARIANT%.V?S DEL /F %TMP%\WAIT_VBS_%RUN_VARIANT%.V?S
GOTO :EOF
:PRG_MAIN_START
Nun kann an jeder beliebigen stelle mit "CALL :WAIT_VBS Millisekunden" eine Wartezeit eingebaut werden.
Beispiel für Wartezeit 5 Sekunden
CALL :WAIT_VBS 5000
3600000 = 1 Stunden
Die Variable RUN_VARIANT wird nur benötigt, wenn man mehrere Batchprogramme parallel laufen hat, die mit der Funktion arbeiten. Sonst ist es nicht notwendig.
Wenn man den Namen der VBS-Datei mit "%Computername%_%USERNAME%" erweitert und z.B. auf dem Server ablegt, kann man sehen welcher Anwender wann welches Programm benutzt.
Ich verwende das z.B. um CAE Anwendungen parallel zu steuern. Dabei kann ich sehen, wann welcher Prozess läuft. Dadurch werden z.B. PDF-Ausgaben von Dokumentationen um den Faktor 10! beschleunigt
Die Kombination VBS und Batch läuft teilweise problemloser als Batch/Powershell
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.
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)!