IF 条件在计划批处理脚本中不起作用

IF 条件在计划批处理脚本中不起作用

我有一个计划的批处理脚本,根据日期参数,它应该在星期四运行。但它没有按预期工作。

找到下面的代码。

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

IF 命令匹配所有字符,包括引号 -Thu 不匹配"Thu"

因此,以下任一方法都可以:

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

编辑 - 我刚刚意识到你在定义 RDAY 时在值中添加了引号。所以我上面用黄色标出的建议不太正确。我更喜欢使用set "RDAY=%date:~0,3%",它不会在值中添加引号。但这更多的是风格问题。

%DATE%因此,您的 IF 语句可能永远不会成立,因为您的机器对不以星期几缩写开头的值使用了不同的格式

但是您的脚本还存在其他问题:

只有您的日志行是有条件的,星期四的脚本将每天运行。只需在 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

当在我的系统上执行脚本时,%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

从 Stack Overflow 文章中找到了以数值表示的星期几(https://stackoverflow.com/questions/11364147/setting-a-windows-batch-file-variable-to-the-day-of-the-week)。

我假设您只希望在星期四为真时运行批处理文件“RunThursday”,您原来的方法就是每天执行该批处理文件,因为它在 IF 语句之外。在 IF 语句后附加“&&”可让批处理文件也得到执行。

希望这有帮助。

相关内容