Batch-Datei mit sichtbarem Stunden und Minuten Timer der per Tastendruck abgebrochen werden kann (zwei Routinen in einer Batch)?

1 Antwort

Vom Beitragsersteller als hilfreich ausgezeichnet

erstmal hast du einen gravierenden Syntaxfehler in Deinem Code:

if %stunden% EQU 0 && %minuten% EQU 0 (

Batch beherrscht keine logische AND-Conditition && ist ist ein Redirection-Operator

ein logosches AND könnte man in batch folgendermaßen darstellen:

set stunden=0
set Minuten=0
if %stunden% equ 0 if %Minuten% equ 0 (echo all conditions are true)

Im falle deine Codes ist der Quatsch nicht nötig, wenn Du nur mit Minuten herunterzählst und die Stunden/Minuten für die Anzeige mit einer Division und einem Modulo berechnest.

set CountdownMinutes=120
:loop
rem ab  hier zählen wir nur noch die variable CountdownMinutes heruntrunter und berechen die daraus resultierende Sunden:Minuten-ausgabe on the fly
set /a "OutHoures=CountdownMinutes / 60 , OutMinutes=CountdownMinutes %% 60"
echo  %OutHoures% Stunden und %OutMinutes% Minuten
::sonstiger  code
timeout 60 >nul
set /a "CountdownMinutes-=1"
goto :loop

Das Abbrechen durch ein Eingabe (welche sozusagen parallel zum Countdown auf einen Tastendruck prüft) ist in Batch nur mit etwas Mogelei zu bewerkstelligen.

Der einzige batchbefehl welcher neben einer primitiven Eingabefunktion auch noch auf einen Timeout reagiert ist choise .

@echo off
echo Druecken Sie 'x'.
rem wir veraten niemaden, das auch eine Taste z definiert ist , welche der  
choice /c xz /d z /t 10 /n
if %ErrorLevel% equ 1 echo X wurde gedückt

echo der Timeout von choice hat automatisch die Taste z ausgeloest
pause

Butter bei die Fische:

demo.cmd

@echo off
mode 80,20
chcp 65001>nul
title Countdown zum Energiesparmodus
:start
cls
echo In wie vielen Stunden soll der PC in den Energiesparmodus wechseln?
set /p stunden=
set /a CountdownMinutes=%stunden%*60
rem Energiesparoptionen auf Höchstleistung setzen
powercfg.exe /setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c


:countdown
rem ab  hier zählen wir nur noch die variable CountdownMinutes heruntrunter und berechen die daraus resultierende Sunden:Minuten-ausgabe on the fly
set /a "OutHoures=CountdownMinutes / 60 , OutMinutes=CountdownMinutes %% 60"  &rem mehrere Batchvariablen in einem Rutsch berechnen ist sehr schnell (für Batchverhältnisse)
cls
echo Der PC wechselt in %OutHoures% Stunden und %OutMinutes% Minuten in den Energiesparmodus.


echo.
echo Drücken Sie 'x', um den Countdown abzubrechen.
choice  /c xz /d z  /t 60 >nul
if %ErrorLevel% equ 1 goto :ende
if %CountdownMinutes% EQU 0 (
    echo Der Countdown ist abgelaufen. Der PC wechselt in den Energiesparmodus.
    rem Energiesparoptionen auf Ausbalanciert setzen
    powercfg.exe /setactive 381b4222-f694-41f0-9685-ff5bb260df2e
    rundll32.exe powrprof.dll,SetSuspendState Sleep
    goto :ende
)
set /a "CountdownMinutes-=1"
goto :countdown


:ende
echo Countdown abgebrochen.
rem Energiesparoptionen auf Ausbalanciert setzen
powercfg.exe /setactive 381b4222-f694-41f0-9685-ff5bb260df2e


pause

Die Timeoutfunktionen von Batch sind sehr Ungenau . Zudem berücksichtigen Schleifen mit einer "Bremsfunktion" nicht den Zeitverbrauch von innerhalb der Schleife ausgeführten sonstign Befehlen , somit kann es durchaus erheblich Diskrepanzen zwischen den Angaben es Zählers und der tatsächlich vergangen Zeit geben.

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

chakrapeople 
Beitragsersteller
 19.08.2024, 09:58

Whoa ! Lieben Dank an ERZESEL! Habe gestern den ganzen Tag genau dies versucht, das Web durchforstet, KI gefragt, weit und breit kein zufriedenstellendes Ergebnis erhalten...
Nun kommst Du und schüttelst sowas schnell aus dem Ärmel... Nochmals HERZLICHEN DANK, you made my day.

1
cleanercode  19.08.2024, 09:51

Mir persönlich würde alles einfallen, aber kein Batch.

0
Erzesel  19.08.2024, 09:58
@cleanercode

Die meisten Anfänger denken Batch sei einfach. und vergessen dabei das die sprache dafür gemacht wurde in paar kleine Aufgaben ohne den Eingriff eines Nutzers zu erledigen. Was der fragesteller tun möchte ist im Konzept von Batch nicht vorgesehen und deshalb nur mit tricks zu lösen.

1