我有一个应用程序每10分钟更新一次.txt文件。第一次在0900(上午9点)之后更新文件的一天我想发送该文件的电子邮件。更新后的文件(由第3行的SET命令指向)可以在0900和0910之间的任何时间显示时间戳。
我建议做的是每天运行0857批处理文件,运行15分钟检查文件的日期戳,直到小时变为09,然后它发送电子邮件并完成。
在下面的代码提取中测试函数,我遇到了简单比较语句的问题:
IF !hour! EQU "09" (GOTO :rundailymail) ELSE (Timeout /T 6).
即使(根据运行时的回声),小时为“09”,比较返回false。
要测试它,您需要一个时间戳介于0900和0959之间的文件。
我很挣扎,并且已经尝试了许多工作来完成这项工作(我已经在那里留下了一些诊断信息)。任何帮助或建议非常感谢。
@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
答案 0 :(得分:3)
批处理代码没有使用双引号将字符串赋值给环境变量,而是用双引号括起所需的变量引用:
@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 "variable=string value"
定义变量几乎总是更好,并在需要时在变量引用周围使用双引号。
BTW:对变量名称和标签使用CamelCase拼写使它们更易于阅读。