Как сравнить сегодняшнюю дату с датой последнего изменения файла без влияния региональных настроек?

Можно получить текущую дату в системе Windows и дату последней модификации файла, например:

  • Текущая дата: date /T
  • Дата последнего изменения: ±echo %~tI% (где %I — файл в цикле FOR)

Однако оба зависят от региональных настроек, поэтому их нужно заменить чем-то другим:

  • Текущая дата : wmic os get localdatetime
  • Дата последнего изменения: ???

Кто-нибудь знает, как заполнить вопросительные знаки?

Справочная информация, идея состоит в том, чтобы получить результат, подобный следующему:

  • Текущая дата: 20170323115047.782000+060
  • Дата последнего изменения: 20170323120513.0123

Отрубите первые восемь символов (чтобы получить день)

  • Текущая дата: 20170323
  • Дата последней модификации: 20170323

Это позволяет увидеть, что файл действительно был изменен сегодня.
Я хочу избежать региональных настроек, чтобы быть уверенным в количестве символов, которые мне нужно отрезать.


person Dominique    schedule 23.03.2017    source источник
comment
Хотя date /T и %%~tI возвращают форматы даты, зависящие от локали, их все же можно использовать для сравнения (не)равенства, поскольку формат один и тот же, учитывая, что вы отделяете временную часть %%~tI в первом промежутке, и что пробел не используется в качестве разделителя даты (что очень маловероятно)...   -  person aschipfl    schedule 24.03.2017


Ответы (6)


Следующий пакет выводит свою собственную дату и время lastmodified через wmic.

@Echo off&SetLocal
set File=%~f0
:: need to escape \ with another one \\
set File=%File:\=\\%
for /f %%a in (
    'wmic  DataFile where "Name='%File%'" get lastmodified   ^| findstr "^[0-9]" '
) do Echo File:%File% lastmodified:%%a

Пример вывода

> 12-16.cmd
File:Q:\\Test\\2017-03\\23\\12-16.cmd lastmodified:20170323123900.908030+060
person Community    schedule 23.03.2017
comment
Этот ответ основан на независимой от региона команде wmic datafile where Name="D:\\Temp_Folder\\<filename>.log" get "last modified", что я и искал. Спасибо. - person Dominique; 24.03.2017

Для сравнения временных меток вы можете использовать forfiles, чтобы найти файлы, измененные сегодня. Я думаю, что это решение более изящно, чем отсечение подстрок из результатов запроса WMI.

@echo off & setlocal

set "file=notes.txt"

forfiles /d +0 /m "%file%" >NUL 2>NUL && (
    echo %file% was modified today.
) || (
    for %%I in ("%file%") do echo %%~I was last modified %%~tI
)

forfiles /? в консоли cmd для получения дополнительной информации. Команда forfiles возвращает 0 при совпадении, 1 при отсутствии соответствия, что позволяет использовать условное выполнение. Кроме того, см. этот связанный вопрос.

person rojo    schedule 23.03.2017

Сценарий LotPings дает вам представление о том, как начать, но есть еще немного о полной проверке. Попробуй это:

@echo off
setlocal
::change to the needed file or to the command line argument
set fileLoc=%~f0
set fileLoc=%fileLoc:\=\\%

for /f "tokens=* delims=" %%# in ('wmic os get localdatetime /format:value') do (
    for  /f "tokens=* delims=" %%a in ("%%#") do set "%%a"
)

::echo %LocalDateTime%
set today=%LocalDateTime:~0,8%
echo today: %today%




for /f "tokens=* delims=" %%# in ('wmic  DataFile where "Name='%fileLoc%'" get lastmodified /format:Value ') do (

    for /f "tokens=* delims=" %%a in ("%%#") do set "%%a"
)

echo %lastmodified%
set lmodified=%lastmodified:~0,8%

if "%lmodified%" equ "%lmodified%" (
    echo modified today
) else (
    echo hasnt been modified today
)
endlocal

Вот объяснение подстроки: https://ss64.com/nt/syntax-substring.html

person npocmaka    schedule 23.03.2017
comment
++npocmaka, а где твой setlocal? Его заметное исключение беспокоит мое обсессивно-компульсивное расстройство. - person rojo; 23.03.2017

Рохо прав, что FORFILES можно использовать для списка файлов, которые были изменены сегодня. Но это S.L..O...W.....

ROBOCOPY намного быстрее :-)

Ниже перечислены недавно измененные файлы в текущем каталоге.

robocopy . . /l /is /maxage:1 /njh /njs /nc /ns /ndl /fp

Вы можете указать конкретный путь, если хотите

robocopy "c:\your\path" "c:\your\path" /l /is /maxage:1 /njh /njs /nc /ns /ndl /fp

Вы можете добавить /S для рекурсивного поиска во всех дочерних папках.

robocopy "c:\your\path" "c:\your\path" /l /is /maxage:1 /njh /njs /nc /ns /ndl /fp /s
person dbenham    schedule 24.03.2017

Хотя date /T/%DATE% и %%~tI возвращают форматы даты, зависящие от языкового стандарта, их по-прежнему можно использовать для сравнения (не)равенства, поскольку форматы одинаковы, учитывая что вы разделяете часть времени %%~tI на первый ПРОБЕЛ и что ПРОБЕЛ не используется в качестве разделителя даты (что очень маловероятно и редко):

for %%I in ("C:\TEMP\test.txt") do set "AGE=%%~tI"
set "AGE=%AGE: =" & rem "%"
if "%AGE%"=="%DATE%" echo File has been modified today.
person aschipfl    schedule 24.03.2017
comment
Ваша точка зрения верна в одной среде, но я наткнулся на эту систему при импорте пакета пакетных файлов из Чехии в Бельгию :-) - person Dominique; 24.03.2017
comment
Вы помните, как выглядели эти форматы даты? - person aschipfl; 24.03.2017

После некоторой работы я нашел способ все запустить и запустить (на основе ответа Лотпинга):

set Filename=F:\\DIR\\Filename.exe
for /f %%a in ('wmic datafile where "Name='!Filename!'" get "lastmodified"^|findstr [0-9]') do set Filename_DATE=%%a
echo Filename_DATE=!Filename_DATE!
set FilenameFinalDATE=!Filename_DATE:~0,8!
echo !FilenameFinalDATE!

(Осторожно, здесь важно все (двойные косые черты, двойные проценты, одинарные и двойные кавычки,...))

person Dominique    schedule 24.03.2017