IF-Bedingung funktioniert nicht im geplanten Batch-Skript

446
RajuK

Ich habe ein geplantes Batch-Skript, basierend auf dem Datumsparameter, das auf Do ausgeführt werden sollte. aber es funktioniert nicht wie erwartet.

Finden Sie den folgenden Code.

::@echo off  set LOGFILE=D:\New_Folder\SCRIPTTEST\Rundaily1.log SET RDAY="%date:~0,3%"  if %RDAY%=="Thu" echo "Starting Weekly Matching" >> %LOGFILE% D:\New_Folder\SCRIPTTEST\Runthursday.bat  exit /b 0 

Wenn der Tag / Tag mit "Thu" übereinstimmt, sollte er das Protokoll schreiben und ein anderes Batch-Skript ausführen.

Aber selbst auf "Thu" schreibt er nicht das Protokoll und führt das Skript nicht aus. kannst du bitte nachsehen und helfen, das Gleiche zu lösen. Bitte vorschlagen.

1
Setzen Sie das Echo auf Ein und sehen Sie echte Befehle im CMD-Fenster. Akina vor 5 Jahren 0

2 Antworten auf die Frage

5
dbenham

Der IF-Befehl stimmt mit allen Zeichen, einschließlich der Anführungszeichen, Thu überein "Thu".

So funktioniert eines der folgenden:

if %RDAY%==Thu ... if "%RDAY%=="Thu" ... 

BEARBEITEN - Ich habe gerade realisiert, dass Sie dem Wert bei der Definition von RDAY Anführungszeichen hinzugefügt haben. Mein Vorschlag oben in gelb ist also nicht ganz richtig. Ich bevorzuge die Verwendung set "RDAY=%date:~0,3%", die dem Wert keine Anführungszeichen hinzufügt. Das ist aber eher eine Frage des Stils.

Vermutlich ist Ihre IF-Anweisung niemals wahr, da Ihr Computer ein anderes Format für den %DATE%Wert verwendet, der nicht mit der Abkürzung für die Wochentage beginnt

Es gibt jedoch andere Probleme mit Ihrem Skript:

Nur Ihre Protokollzeile ist bedingt, das Donnerstag-Skript wird jeden Tag ausgeführt. Dies kann leicht behoben werden, indem Sie Ihrem IF-Block Klammern hinzufügen

if %DATE:~0,3%==Thu ( echo "Starting Weekly Matching" >> %LOGFILE% D:\New_Folder\SCRIPTTEST\Runthursday.bat ) 

Das Format des %DATE%Werts ist abhängig vom Gebietsschema. Ihr Skript funktioniert wahrscheinlich nicht auf einem anderen Rechner. Sie können WMIC verwenden, um auf einfache Weise festzustellen, ob es sich um einen locale-agnostischen Weg vom Donnerstag handelt:

wmic path win32_localtime get dayofweek | findstr 4 >nul && ( echo "Starting Weekly Matching" >> %LOGFILE% D:\New_Folder\SCRIPTTEST\Runthursday.bat ) 

Ich habe jedoch eine Frage an Sie: Warum planen Sie einen täglichen Batch-Job, der nur am Donnerstag einen anderen Batch ausführt? Wenn Sie einen Batch-Job donnerstags ausführen möchten, verwenden Sie den Windows Task Scheduler, um genau dies zu tun. In Ihrem Batch-Skript müssen Sie nicht feststellen, ob heute Donnerstag ist. Lassen Sie den Scheduler die Arbeit erledigen.

2
CraftyB

Beim Durchlaufen des Skripts auf meinem System scheint% RDAY% der Wert "27" zu sein. Dies ist der aktuelle Tag des Monats und nicht der Tag "Do", wie Sie es erwarten.

Ich würde vorschlagen, folgendes zu versuchen:

::@echo off  set LOGFILE=D:\New_Folder\SCRIPTTEST\Rundaily1.log for /f %%a in ('wmic path win32_localtime get dayofweek /format:list ^| findstr "="') do (set %%a)  if %dayofweek%==4 echo "Starting Weekly Matching" >> %LOGFILE% && D:\New_Folder\SCRIPTTEST\Runthursday.bat  exit /b 0 

Wochentag als numerischen Wert aus einem Stapelüberlaufartikel gefunden ( https://stackoverflow.com/questions/11364147/setting-a-windows-batch-file-variable-to-the-day-of-the-week ) .

Ich gehe davon aus, dass die Batch-Datei "RunThursday" nur ausgeführt werden soll, wenn Donnerstag wahr ist. Die ursprüngliche Methode hätte die Batch-Datei jeden Tag ausgeführt, da sie außerhalb der IF-Anweisung lag. Durch Anhängen Ihrer IF-Anweisung mit "&&" können Sie auch die Batchdatei ausführen.

Hoffentlich hilft das.