I want to create a batch to check if the file have been modified to today's date, what i did was to "bring in a system's date and compare it with the modified date, if they match, then trigger something. My batch file works well and displays two right dates, but the IF statement saying the date mismatch.
@ECHO OFF
for /f "tokens=1,2,3,4 delims=. " %%i in ('date /t') do set date=%%k%%j
echo %date%
pause
FOR %%a IN (D:\MyFile.txt) DO SET FileDate=%%~ta
set DATEONLY=%FileDate:~0,10%
echo %DATEONLY%
pause
if DATEONLY==date (
echo date ok
)
else (
cls
ECHO Wrong
)
PAUSE
There are the following problems:
- do not use variable name
date
as this is a built-in variable containing the current date (type set /?
for help);
- the first
for
statement is useless, because %date%
is already available;
- the strings
DATEONLY
and date
are compared literally in your if
statement, you need to state %DATEONLY%==%date%
instead;
- the
else
statement must be in the same line as the closing parenthesis of the if
body (type if /?
for help);
So try this:
@ECHO OFF
echo %date%
pause
FOR %%a IN (D:\MyFile.txt) DO SET FileDate=%%~ta
set DATEONLY=%FileDate:~0,10%
echo %DATEONLY%
pause
if %DATEONLY%==%date% (
echo date ok
) else (
ECHO Wrong
)
PAUSE
Note: Regard that all those dates in the batch file are locale-dependent.
Here is a completely different approach:
forfiles /P . /M MyFile.txt /D +0 /C "cmd /C echo @fdate @file"
The forfiles
command is capable of checking the file date. In the above command line, it:
- walks through the current directory (
.
),
- lists all files named
MyFile.txt
(of course there is onlyone),
- but only if it has been modified
+0
days after today,
- and then executed the command line after the
/C
switch.
If MyFile.txt
has been modified today (or even in future), the given command line is executed;
if it has been modified earlier than today, an error message is displayed and ERRORLEVEL
is set to 1
.
Notice that forfiles
is not a built-in command and might not be available on your operating system.