Batch-Datei mit sichtbarem Stunden und Minuten Timer der per Tastendruck abgebrochen werden kann (zwei Routinen in einer Batch)?
ich brauche eine Batch.
Beim starten wird gefragt, in wievielen Stunden der PC in den Energiesparmodus wechseln soll.
Die VERBLEIBENDE Zeit sollte IMMER sichtbar sein und die STUNDEN /MINUTEN runterzählen.
Wenn der Timer abgelaufen ist, sollte der PC in den Energiesparmodus gehen.
Desweiteren will ich den Countdown jederzeit wieder abbrechen können um das Programm zu verlassen,
OHNE den PC in den Energiesparmodus zu versetzen..
Am besten wäre es, wenn ich beim Abbechen des Timers nur eine Taste,
zum Beispiel (X) drücken müsste, ohne enter...(Darf gerne, muss aber nicht sein).
Ich habe schon per KI versucht dies alles hinzubekommen, aber leider bleibt der Timer hängen bei der Abbrechen-Abfrage.
@echo off
mode con cols=77 lines=6
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 minuten=%stunden%*60
rem Energiesparoptionen auf Höchstleistung setzen
powercfg.exe /setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
:countdown
cls
echo Der PC wechselt in %stunden% Stunden und %minuten% Minuten in den Energiesparmodus.
set /a minuten=%minuten%-1
if %minuten% LSS 0 (
set /a stunden=%stunden%-1
set /a minuten=59
)
echo.
echo Drücken Sie 'x', um den Countdown abzubrechen.
set /p eingabe=
if "%eingabe%"=="x" goto :ende
if %stunden% EQU 0 && %minuten% 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
)
timeout /t 60 >nul
goto countdown
:ende
echo Countdown abgebrochen.
rem Energiesparoptionen auf Ausbalanciert setzen
powercfg.exe /setactive 381b4222-f694-41f0-9685-ff5bb260df2e
1 Antwort
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.
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.
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.
Mir persönlich würde alles einfallen, aber kein Batch.