Batch - set/p mit Countdown?

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.

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