2016-12-17 5 views
2

Ich arbeite an einem kleinen Batch-Programm, und ich habe Probleme mit der Programmierung der Zeit-Scripting, was ich meine, indem ich Menschen in dem Programm in einer bestimmten Zeit erlaubt. Die bestimmte Zeit ist um 12:00 Uhr geöffnet und um 11:00 Uhr geschlossen. Das ist mein Skript so weit:Wie behebe ich dieses Batch-Time-Skript?

@echo off 
    set current_time=%time:~0,5% 
    rem This piece of code below is to make it start 
    if %current_time% == "12:00" goto :START 
    rem this piece of code below is to make it stop 
    if %current_time% == "23:00" goto :STOP 
    rem and if you know batch you'll get these two 
    if %current_time% lss "12:00" if %current_time% gtr "23:00" goto :STOP 
    if %current_time% gtr "12:00" if %current_time% lss "23:00" goto :START 
    :START 

    echo The program has successfully ran. 
    echo Press anything to exit now. 
    pause >nul 
    exit 
    :STOP 
    echo Sorry, but this program is closed. Come back at 12:00 P.M. 
    pause >nul 
    exit 

Wenn ich den Code versuchen, es einfach ignoriert völlig die Zeit Konfiguration und geht direkt auf die Startprozedur. Weiß jemand, wie man das repariert? Auch BITTE BEACHTEN SIE: Ich verwende Windows 10.

+3

Willkommen als neue Benutzer konstruieren zu SO. Ich weiß nicht, was genau Sie von Ihrem Code erwarten. Wie ich sehe, ist alles ganz normal. Batch kennt nur 2 Variablentypen, String und 32-Bit-Ganzzahlen mit Vorzeichen. Die Anführungszeichen und der Doppelpunkt erzwingen einen Zeichenfolgenvergleich. Wenn Sie möchten, dass der Batch zu einem bestimmten Zeitpunkt pausiert und einen weiteren Vergleich durchführt, müssen Sie eine Schleife erstellen und Ressourcen ein wenig verzögern. Siehe "Hilfe" und "Hilfe Timeout" – LotPings

+0

Ein weiterer Hinweis, gestapelt, wenn die nur wahr sind, wenn beide Bedingungen erfüllt sind, Ihre Zeile goto: Stop kann nie wahr sein, da eine Zahl nicht weniger sein kann 1200 und gtr 2300. Nehmen Sie die anderen wenn und append und else-Klausel. Aber da Sie in beiden Fällen den Batch mit exit verlassen, sind die Schleife und die Verzögerung für Ihre Logik nicht sinnvoll. – LotPings

+0

@LotPings: Dieser Satz: _ "Batch kennt nur 2 Variablentypen: Zeichenfolge und 32-Bit-Ganzzahlen mit Vorzeichen" _ ist nicht ganz genau. Batch-Umgebungsvariablen können nur ** Strings ** enthalten. Bestimmte Befehle, wie 'set/A' und andere, _konvertieren _ die Zeichenfolge in eine 32-Bit-Ganzzahl, bevor sie sie ausführen, und das numerische Ergebnis zurück in eine Zeichenfolge umwandeln, bevor sie in einer Variablen gespeichert wird ... – Aacini

Antwort

1

Wie ich bereits erwähnt Sie Timeout für eine Verzögerung verwenden können, aber es gibt auch
Choice - eine eine Tasteneingabe, die mit einem Errorlevel reagiert auf die Sie beim Verzögern abbrechen können.

Wie aacini in seinem Kommentar ausführt, speichern Variablen nur Strings Set/A und wenn versuchen, wenn möglich, in eine ganze Zahl zu konvertieren.

Eine Sache, immer daran denken, dass Zahlen mit einer führenden Null behandelt werden als in Oktal (0x als hex.) Codiert Dies ist wichtig, wenn mit Datum/Uhrzeit Teile Monat Tage Stunden Minuten Sekunden zu tun. Hier

ist ein Beispiel für einen gestapelte wenn sonst

@echo off 
:loop 

Set Now=%time:~0,2%%time:~3,2% 
If "%Now:~0,1%" equ "0" Set Now=%Now:~1%" 
cls&Echo %Time:~0,8% Now=%Now% 

if %Now% geq 1200 (
    if %Now% leq 2300 (
     goto :START 
    ) Else (
     goto :Stop 
    ) 
) Else (
    Goto :Stop 
) 
Rem Could never reach here 

:START 
echo The program has successfully ran. 
echo Press anything to exit now. 
pause >nul 
exit 

:STOP 
echo Sorry, but this program is closed. Come back at 12:00 P.M. 
echo To abort, hit A 
Choice /T 2 /C AN /M "Abort [A/N] " /D N >NUL 
If %ErrorLevel% == 1 exit /B 
Goto :loop 
+0

Danke LotPings. Ich werde diesen Code ausprobieren. – WinterPyro

+0

Siehe 'Hilfe if' Sie schrieben" Komm zurück um 12:00 ", aber Sie testeten gtr 1200 Dies ist nicht größer also geq = größer oder gleich ist der richtige Vergleichsoperator. – LotPings

+0

Es hat funktioniert. Vielen Dank! – WinterPyro

1
if %current_time% lss "12:00" if %current_time% gtr "23:00" goto :STOP 

current_time kann zB sein. 12:57. 12:57 und "12:57" sind völlig unterschiedliche Zeichenfolgen. Sie müssen die Variable zitieren, wo immer Sie es gegen einen Kurswert vergleichen,

if "%current_time%" lss "12:00" if "%current_time%" gtr "23:00" goto :STOP 

ABER während dies den Vergleich zu korrigieren, führt dieser Code eine „und“ Funktion, so dass Sie „Zeit < 12 fragen : 00 "UND" Zeit> 23:00 ", was niemals wahr sein wird. Ihre nächste Anweisung kann werden wahr, aber seit diese Anweisung wird nie wahr, Batch wird einfach auf die nächste Anweisung überspringen. Es ignoriert Labels - sie sind nur Positionsmarker.

+0

current_time gibt tatsächlich die richtige Zeit an. Wenn ich es in ** echo ** verwenden wollte, würde es mir die genaue Zeit im Format Stunde: Minute anzeigen. Außerdem habe ich eine Frage, über welchen Code sprachen Sie?War es das ** ABER ** oder sowas? – WinterPyro

Verwandte Themen