Batdatei, Syntaxproblem oder so

Brauno

Cadet 2nd Year
Registriert
Juni 2018
Beiträge
28
Guten Abend!
Kann mir jmd sagen wieso, wenn ich in das Menü gehe wo man selber die Zeit eingeben kann ( starte die bat, drücke 9 ) entweder der Pc in 15 min runterfährt oder das cmd Fenster sich schließt?


@Echo on
:Herunterfahren
shutdown /a
:Vars
set /a ping = 2
set /a time = 15*60
set /a multiplikator = 1
:startmenü
echo.
echo # Der Pc soll in ... herunterfahren. #
echo # 1. sofort #
echo # 2. 15 Min. #
echo # 3. 30 Min. #
echo # 4. 60 Min. #
echo # 5. 2 Stunden #
echo # 6. 4 Stunden #
echo # 7. 8 Stunden #
echo # 8. special shit #
echo # 9. [Eingabe] #
echo # 10. exit #
echo.
choice /c 123456789 /t 8 /d 1 >nul
cls
echo PC wird herunterfahren
goto %errorlevel%
pause
:1
shutdown /s /t 155 /f
goto Exit
:2
set /a multiplikator = 1*time
shutdown /s /t %multiplikator% /f
goto Exit
:3
set /a multiplikator = 2*time
shutdown /s /t %multiplikator% /f
goto Exit
:4
set /a multiplikator = 4*time
shutdown /s /t %multiplikator% /f
goto Exit
:5
set /a multiplikator = 8*time
shutdown /s /t %multiplikator% /f
goto Exit
:6
set /a multiplikator = 16*time
shutdown /s /t %multiplikator% /f
goto Exit
:7
set /a multiplikator = 32*time
shutdown /s /t %multiplikator% /f
goto Exit
:8
echo noch in Arbeit!
@ping localhost -n %ping% > NUL
.
@ping localhost -n %ping% > NUL
goto startmenü

:9
:: Hier beginnt das Untermenü
echo.
echo 1. Minuten
echo 2. Stunden
echo 3. Tage
echo 4. Starmenue
echo.
choice /c 1234 >nul
echo %errorlevel%
if %errorlevel% == 1 (
set /a multiplikator = 60
set type = Minuten )
if %errorlevel%" == 2 (
set /a multiplikator = 60*60
set type = Stunden )
if %errorlevel% == 3 (
set /a multiplikator = 3600*24
set type = Tage )
if %errorlevel% == 4 (
goto startmenü ) else (
goto 9 )
cls
:input
echo Countdown in Min/h/d :
set /p time = %type%
if %time% LSS 0 (
cls
echo Bitte gebe eine Zahl zwischen 1 und unendlich ein!
goto input ) else (
set /a time = %time% * %multiplikator%
shutdown /s /t %time% /f
goto Exit )



:Exit
exit
Ergänzung ()

Hier ist sie noch mal als Datei, ich gehe jz erst mal ins Bett
 
Das :herunterfahren mit dem anschliessendem Shutdown /a muss ans ende, sonst wirds doch immer gleich ausgeführt, bevor Variablen gesetzt werden. Morgen mehr.
 
Und bis dahin setze bitte den Batch-Code in die Code-Tags, @Brauno :)

Sieht dann so aus.

Code:
@Echo on
:Herunterfahren
shutdown /a
:Vars
set /a ping = 2
set /a time = 15*60
set /a multiplikator = 1
:startmenü
echo.
echo # Der Pc soll in ... herunterfahren. #
echo # 1. sofort #
echo # 2. 15 Min. #
echo # 3. 30 Min. #
echo # 4. 60 Min. #
echo # 5. 2 Stunden #
echo # 6. 4 Stunden #
echo # 7. 8 Stunden #
echo # 8. special shit #
echo # 9. [Eingabe] #
echo # 10. exit #
echo.
choice /c 123456789 /t 8 /d 1 >nul
cls
echo PC wird herunterfahren
goto %errorlevel%
pause
:1
shutdown /s /t 155 /f
goto Exit
:2
set /a multiplikator = 1*time
shutdown /s /t %multiplikator% /f
goto Exit
:3
set /a multiplikator = 2*time
shutdown /s /t %multiplikator% /f
goto Exit
:4
set /a multiplikator = 4*time
shutdown /s /t %multiplikator% /f
goto Exit
:5
set /a multiplikator = 8*time
shutdown /s /t %multiplikator% /f
goto Exit
:6
set /a multiplikator = 16*time
shutdown /s /t %multiplikator% /f
goto Exit
:7
set /a multiplikator = 32*time
shutdown /s /t %multiplikator% /f
goto Exit
:8
echo noch in Arbeit!
@ping localhost -n %ping% > NUL
.
@ping localhost -n %ping% > NUL
goto startmenü
:9
:: Hier beginnt das Untermenü
echo.
echo 1. Minuten
echo 2. Stunden
echo 3. Tage
echo 4. Starmenue
echo.
choice /c 1234 >nul
echo %errorlevel%
if %errorlevel% == 1 (
set /a multiplikator = 60
set type = Minuten )
if %errorlevel%" == 2 (
set /a multiplikator = 60*60
set type = Stunden )
if %errorlevel% == 3 (
set /a multiplikator = 3600*24
set type = Tage )
if %errorlevel% == 4 (
goto startmenü ) else (
goto 9 )
cls
:input
echo Countdown in Min/h/d :
set /p time = %type%
if %time% LSS 0 (
cls
echo Bitte gebe eine Zahl zwischen 1 und unendlich ein!
goto input ) else (
set /a time = %time% * %multiplikator%
shutdown /s /t %time% /f
goto Exit )

:Exit
exit

BFF
 
  • Gefällt mir
Reaktionen: Brauno
Samurai76 schrieb:
Das :herunterfahren mit dem anschliessendem Shutdown /a muss ans ende, sonst wirds doch immer gleich ausgeführt, bevor Variablen gesetzt werden. Morgen mehr.
Wieso? Wenn ich die bat starte und bereits der Computer in 10 Min runterfahren soll, kann ich die Zeit nicht überschreiben sondern ich muss den Vorgang erst einmal abbrechen. Dann kann ich erst den Pc in einer bestimmten Zeit runterfahren.
 
Ja, richtig, shutdown abbrechen. Stimmt, war zu spät. Was mir sonst auffällt: Set /a braucht man nur, wenn man rechnet, lass /a beim einfachen setzen mal weg. Und initialisiere Varaiable c. (mit 0?). Und die Leerzeichen zw. Variabel, = und Wert mal weglassen.
Mehr fällt mir nicht auf, wenns nicht hilft, müssen andere ran.
 
Zuletzt bearbeitet:
Danke! Ich habe es noch mal überarbeitet und jetzt läuft es wie es soll. Aber bei der Stelle wo man den input gibt möchte ich eine Abfrage haben, die überprüft ob der input negativ ist und wenn er das ist, soll der User etwas Positives eingeben.
Ich habs so gemacht:

if "%eingabe%" leq "0" goto Eingabe
 
Ich würde die Batch im übrigen noch seeeeehr stark einkürzen. Statt Dutzende Sprungmarken mit nahezu ein- und demselben Aufruf von shutdown zu bauen, könnte man mit einer Funktion arbeiten. Ungefähr so sähe das dann aus:

Code:
IF ERRORLEVEL==1 CALL:MYSHUTDOWN 0&GOTO:EOF
IF ERRORLEVEL==2 CALL:MYSHUTDOWN 15&GOTO:EOF
IF ERRORLEVEL==3 CALL:MYSHUTDOWN 30&GOTO:EOF


:MYSHUTDOWN shutdownInMinuten
SET /a shutdowntimer=60*%1
shutdown /s /t %shutdowntimer% /f
GOTO:EOF

Zur Erklärung: Statt goto prüfe ich hier direkt den Errorlevel und rufe dann lediglich die Sprungmarke als Funktion auf und beende danach direkt die Batch. Statt GOTO:EOF (dann braucht man keine :exit Sprungmarke) kann man natürlich auch ins Untermenü springen. Wenn man eine Springmarke mit CALL: als Funktion aufrufen will, muss man am Ende der Sprungmarke ein GOTO:EOF haben, das ist quasi das Return der Funktion. Innerhalb der Sprungmarke kann man dann mit %1, %2, etc die Funktionsparameter abrufen. Im Beispiel ist es die Shutdownzeit in Minuten. Um mir das selbst zu verdeutlichen, schreibe ich das auch immer hinter eine Funtions-Sprungmarke als Kommentar dazu (Sprungmarken werden nur bis zum ersten SPACE ausgewertet)

Und noch ein Tip: Verwende "time" nicht als Variable, da es bereits eine Variable ist! Gib mal direkt in der Eingabeaufforderung echo %time% ein und du wirst sehen, dass die Zeit ausgegeben wird.
 
Zurück
Oben