Windows Batch IF!小时! EQU“09”未返回TRUE

时间:2016-07-03 04:09:38

标签: windows batch-file cmd

我有一个应用程序每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

1 个答案:

答案 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拼写使它们更易于阅读。