2016-07-03 17 views
2

10分ごとに.txtファイルを更新するアプリケーションがあります。 09:00(9am)以降にファイルが更新された最初の日に、そのファイルの電子メールを送信したいと思います。更新されたファイル(3行目のSETコマンドが指す)は、0900から0910の間の任意のタイムスタンプを持つことができます。WindowsバッチIF!時間! EQU "09"がTRUEを返さない

私が提案しているのは、毎日0857で15分実行するバッチファイルを実行する時間が09になるまでファイルの日付スタンプをチェックすると、電子メールを送信して終了します。

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

(私はそれを実行したときにエコーするに従って)、時間は「09」であるにもかかわらず:機能をテストするには、以下のコードエキスで

は、私はシンプルで問題文を比較しましたよ、compareは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 
+3

'set hour ='の後に余分なスペースを入れます。つまり、スペースは「時間」の始まりになります。 – librik

+2

'!hour!' - 'if"!hour!の前後にも引用符が必要です!"equ" 09 "' – SomethingDark

+2

は 'set hour = value'またはより良い' set "hour = value"を使用します。スペースはありません。 '='の前のスペースは変数名に入り、その後のスペースは値になります –

答えて

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 

を元のコードが等しい後、スペース文字に失敗しましたまた、二重引用符のような変数hourに割り当てられているライン

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

にサインインします。

そのため、比較される文字列は "09""09"であり、文字列はここで見られるように等しくありません。

文字列の比較は、遅延拡張の使用なしになる場合は、比較が偶然の仕事でhourの文字列値を囲む二重引用符でになりますので、標準拡大に先頭のスペースはコマンド間だけ追加スペースになりますIFと二重引用符で囲まれた最初の文字列は、この余分なスペースを無視します。しかし、ここでは遅延拡張が必要な​​ため、スペースは文字列比較で無視されません。構文set "variable=string value"で変数を定義し、必要な変数の参照を二重引用符を使用することはほぼ常に優れている理由を

に答えを設定します。

BTW:変数名とラベルにCamelCaseのスペルを使用すると、読みやすくなります。

関連する問題