ЕСЛИ условие не работает в запланированном пакетном скрипте

377
RajuK

У меня есть запланированный пакетный скрипт, основанный на параметре даты, который он должен запускать в четверг. но это не работает, как ожидалось.

Найдите код ниже.

::@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 

согласно приведенному выше коду, если дата / день соответствует «Чт», он должен записать журнал и выполнить другой пакетный скрипт.

но даже на "Чт" его не пишет журнал и не работает сценарий. Можете ли вы проверить и помочь решить то же самое. Пожалуйста, предложите.

1
Включите echo и посмотрите реальные команды в окне CMD. Akina 5 лет назад 0

2 ответа на вопрос

5
dbenham

Команда IF соответствует всем символам, включая кавычки - Thu не соответствует "Thu".

Так что будет работать любое из следующего:

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

РЕДАКТИРОВАТЬ - Я только что понял, что вы добавили кавычки к значению, когда вы определили RDAY. Так что мое предложение выше желтым не совсем верно. Я предпочитаю использовать set "RDAY=%date:~0,3%", который не добавляет кавычки к значению. Но это больше вопрос стиля.

Так что, по-видимому, ваше утверждение IF никогда не будет верным, потому что ваша машина использует другой формат для %DATE%значения, которое не начинается с сокращения дня недели

Но есть и другие проблемы с вашим скриптом:

Только ваша строка журнала является условной, сценарий четверга будет выполняться каждый день. Это легко исправить, добавив скобки в ваш блок IF

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

Формат %DATE%значения зависит от локали. Ваш сценарий, скорее всего, не будет работать на другом компьютере. Вы можете использовать WMIC, чтобы легко определить, является ли это четверг независимо от локали:

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

Но у меня к вам вопрос: почему вы планируете ежедневное пакетное задание, которое запускает другой пакет только в четверг? Если вы хотите запускать пакетное задание по четвергам, используйте планировщик заданий Windows, чтобы сделать это. Нет необходимости определять, является ли сегодня четверг в вашем пакетном скрипте, пусть планировщик сделает всю работу.

2
CraftyB

При выполнении сценария в моей системе% RDAY% представляется значением «27», которое является текущим днем ​​месяца, а не днем ​​«чт», как вы ожидаете.

Я бы предложил попробовать следующее:

::@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 

Нашел день недели в виде числового значения в статье о переполнении стека ( https://stackoverflow.com/questions/11364147/setting-a-windows-batch-file-variable-to-the-day-of-the-week ) ,

Я предполагаю, что пакетный файл «RunThursday», который вы хотите запустить, только если четверг верен, ваш исходный подход выполнял бы пакетный файл каждый день, как это было за пределами оператора IF. Добавление оператора IF к «&&» также позволяет выполнять командный файл.

Надеюсь, это поможет.