Windows批处理!小时! EQU“09”不返回TRUE

我有一个应用程序,每10分钟更新一个.txt文件。 在09:00(上午9点)之后第一次每天更新一次文件,我想发送该文件的电子邮件。 更新的文件(由第3行的SET命令指向)可以在0900和0910之间的任何时间有一个时间戳。

我build议做的是每天运行一个batch file,每天运行15分钟,检查文件的date戳,直到小时变为09,然后发送电子邮件并结束。

在下面的代码提取testing函数,我有一个简单的比较语句的问题:

IF !hour! EQU "09" (GOTO :rundailymail) ELSE (Timeout /T 6). 

即使(根据回声,当我运行它),小时是“09”,比较返回错误。

要testing它,你需要有一个时间戳在0900到0959之间的文件。

我很挣扎,并尝试了很多东西来使这个工作(我已经在那里留下了一些诊断)。 任何帮助或build议非常感谢。

 @echo on Setlocal EnableDelayedExpansion SET filename="D:\Temp Files\test.txt" IF NOT EXIST %filename% GOTO log rem echo %filedatetime% for /l %%x in (1, 1, 20) do ( FOR %%f IN (%filename%) DO SET filedatetime=%%~tf echo !filedatetime! SET hour= "!filedatetime:~11,-6!" Echo !hour! IF !hour! EQU "09" (GOTO :rundailymail) ELSE (Timeout /T 60) ) :failedtofindfile ECHO "Failed to find the right file timestamp" goto end :rundailymail ECHO "send the daily email" goto end :log ECHO "FILE MISSING" goto end :end 

批处理代码,不用将双引号分配给环境变量的字符串,而是用双引号括住变量引用:

 @echo off setlocal EnableDelayedExpansion set "FileName=D:\Temp Files\test.txt" if not exist "%FileName%" goto Log for /L %%X in (1,1,20) do ( for %%F in ("%FileName%") do set "FileDateTime=%%~tF" echo !FileDateTime! set "Hour=!FileDateTime:~11,2!" echo !Hour! if "!Hour!" == "09" ( goto RunDailyMail ) else ( timeout /T 60 ) ) :FailedToFindFile echo Failed to find the right file timestamp goto End :RunDailyMail echo Send the daily email goto End :Log echo FILE MISSING: %FileName% goto End :End endlocal 

由于等号后的空格字符原来的代码失败

 SET hour= "!filedatetime:~11,-6!" 

这也是分配给像双引号变量hour

出于这个原因,比较的字符串是"09""09" ,字符串是不相等的,因为现在可以看到。

如果字符串比较不使用延迟扩展,比较将偶然的工作,因为hour字符串值将与周围的双引号相同,并且标准扩展的前导空间将只是命令IF与双引号之间的额外空间第一个字符串导致忽略这个额外的空间。 但是这里需要延迟扩展,因此在字符串比较中空间不被忽略。

设置答案

  • 如何设置空格的环境变量?
  • 为什么在命令行上使用'set var = text'后没有输出字符串'echo%var%'?

为什么使用语法set "variable=string value"来定义变量几乎总是更好,并且在需要的地方围绕变量引用使用双引号。

顺便说一句:使用CamelCase拼写变量名称和标签使它们更易读。