Windows批处理如果!小时!等;09“;不归真

Windows批处理如果!小时!等;09“;不归真,windows,batch-file,cmd,Windows,Batch File,Cmd,我有一个应用程序,每10分钟更新一个.txt文件。每天早上9点(上午9点)后第一次更新文件时,我想发送一封该文件的电子邮件。更新的文件(由第3行上的SET命令指向)的时间戳可以是0900到0910之间的任何时间 我建议每天0857运行一个批处理文件,运行15分钟,检查文件的日期戳,直到时间变为09,然后发送电子邮件并完成 在下面测试函数的代码摘录中,我对简单的compare语句有一个问题: IF !hour! EQU "09" (GOTO :rundailymail) ELSE (Timeou

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

我建议每天0857运行一个批处理文件,运行15分钟,检查文件的日期戳,直到时间变为09,然后发送电子邮件并完成

在下面测试函数的代码摘录中,我对简单的compare语句有一个问题:

 IF !hour! EQU "09" (GOTO :rundailymail) ELSE (Timeout /T 6). 
尽管(根据我运行echo时的数据),小时数是“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

批处理代码不向环境变量分配带双引号的字符串,而是在需要时将变量引用括在双引号中:

@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和双引号第一个字符串之间的一个额外空格,从而忽略此额外空格。但是这里需要延迟扩展,因此在字符串比较中不会忽略空格

设定答案

为什么使用语法
设置“variable=string value”
定义变量并在需要时在变量引用周围使用双引号几乎总是更好


顺便说一句:对变量名和标签使用CamelCase拼写可以使它们更容易阅读。

设置小时=
后加上一个空格。这意味着空格在
小时的开始处
。您还需要在
周围加引号!小时-
如果“!hour!”等于“09”
请使用
设置小时=值
或更好的
设置小时=值,无空格。变量名前面的空格,变量名后面的空格,值mofi、librik、SomethingDark和Lưu Vĩnh Phúc,非常感谢您的帮助。很抱歉回复有点慢-当有人添加时,我正在等待即时电子邮件的建议。你提供的更正非常有效。讨厌的空格和语义:-)再次感谢大家。